Есть ли хороший способ передать большой кусок данных между двумя подпроцессами python без использования диска? Вот мультяшный пример того, что я надеюсь выполнить:
import sys, subprocess, numpy
cmdString = """
import sys, numpy
done = False
while not done:
cmd = raw_input()
if cmd == 'done':
done = True
elif cmd == 'data':
##Fake data. In real life, get data from hardware.
data = numpy.zeros(1000000, dtype=numpy.uint8)
data.dump('data.pkl')
sys.stdout.write('data.pkl' + '\\n')
sys.stdout.flush()"""
proc = subprocess.Popen( #python vs. pythonw on Windows?
[sys.executable, '-c %s'%cmdString],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for i in range(3):
proc.stdin.write('data\n')
print proc.stdout.readline().rstrip()
a = numpy.load('data.pkl')
print a.shape
proc.stdin.write('done\n')
Это создает подпроцесс, который генерирует массив numpy и сохраняет массив на диск. Затем родительский процесс загружает массив с диска. Он работает!
Проблема в том, что наше оборудование может генерировать данные в 10 раз быстрее, чем диск может читать/писать. Есть ли способ перенести данные из одного процесса python в другой исключительно в памяти, возможно, даже без создания копии данных? Могу ли я сделать что-то вроде передачи по ссылке?
Моя первая попытка переноса данных исключительно в памяти довольно паршивая:
import sys, subprocess, numpy
cmdString = """
import sys, numpy
done = False
while not done:
cmd = raw_input()
if cmd == 'done':
done = True
elif cmd == 'data':
##Fake data. In real life, get data from hardware.
data = numpy.zeros(1000000, dtype=numpy.uint8)
##Note that this is NFG if there a '10' in the array:
sys.stdout.write(data.tostring() + '\\n')
sys.stdout.flush()"""
proc = subprocess.Popen( #python vs. pythonw on Windows?
[sys.executable, '-c %s'%cmdString],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
for i in range(3):
proc.stdin.write('data\n')
a = numpy.fromstring(proc.stdout.readline().rstrip(), dtype=numpy.uint8)
print a.shape
proc.stdin.write('done\n')
Это очень медленный (гораздо медленнее, чем сохранение на диске) и очень, очень хрупкий. Там должен быть лучший способ!
Я не женат на модуле "subprocess", если процесс обработки данных не блокирует родительское приложение. Я кратко попробовал "многопроцессорную обработку", но пока не успел.
Фон: у нас есть часть оборудования, которое генерирует до ~ 2 ГБ/с данных в серии буферов ctypes. Код python для обработки этих буферов имеет свои руки, полностью связанные с потоком информации. Я хочу координировать этот поток информации с несколькими другими аппаратными средствами, запущенными одновременно в "основной" программе, без подпроцессов, блокирующих друг друга. Мой текущий подход заключается в том, чтобы немного свернуть данные в подпроцессе перед сохранением на диск, но было бы неплохо передать полный monty в процесс "master".