¿Cómo paso grandes matrices numpy entre subprocesos de python sin guardarlas en el disco?

¿Hay una buena manera de pasar una gran cantidad de datos entre dos subprocesos de Python sin usar el disco? Aquí hay un ejemplo de dibujos animados de lo que espero lograr:

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')

Esto crea un subproceso que genera una matriz numpy y guarda la matriz en el disco. El proceso padre luego carga la matriz del disco. ¡Funciona

El problema es que nuestro hardware puede generar datos 10 veces más rápido de lo que el disco puede leer / escribir. ¿Hay alguna manera de transferir datos de un proceso de Python a otro puramente en memoria, tal vez incluso sin hacer una copia de los datos? ¿Puedo hacer algo como pasar por referencia?

Mi primer intento de transferir datos puramente en memoria es bastante pésimo:

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's 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')

Esto es extremadamente lento (mucho más lento que guardar en el disco) y muy, muy frágil. ¡Tiene que haber una mejor manera!

No estoy casado con el módulo 'subproceso', siempre y cuando el proceso de toma de datos no bloquee la aplicación principal. Intenté brevemente el 'multiprocesamiento', pero sin éxito hasta ahora.

Background: Tenemos una pieza de hardware que genera hasta ~ 2 GB / s de datos en una serie de búferes ctypes. El código de Python para manejar estos buffers tiene sus manos llenas solo lidiando con la avalancha de información. Quiero coordinar este flujo de información con varias otras piezas de hardware que se ejecutan simultáneamente en un programa 'maestro', sin que los subprocesos se bloqueen entre sí. Mi enfoque actual es reducir un poco los datos en el subproceso antes de guardarlos en el disco, pero sería bueno pasar todo el dinero al proceso 'maestro'.

Respuestas a la pregunta(6)

Su respuesta a la pregunta