обо всем по порядку; Я думаю, что у вас неправильные режимы:
unzipfile1 = gzip.open(zipfile1, 'wb')
Это должно открыться zipfile1
для записи , а не чтения. Я надеюсь, что ваши данные все еще существуют.
Во-вторых, вы не хотите пытаться работать со всеми данными одновременно . Вы должны работать с данными в блоках по 16 КБ или 32 КБ или что-то. (Оптимальный размер будет варьироваться в зависимости от многих факторов; сделайте его настраиваемым, если эту задачу нужно выполнять много раз, чтобы можно было рассчитывать разные размеры.)
То, что вы ищете, вероятно, больше похоже на этот непроверенный псевдокод:
while (block = unzipfile1.read(4096*4)):
p1.stdin.write(a)
Если вы пытаетесь соединить несколько процессов в конвейере в Python, то это, вероятно, будет выглядеть примерно так:
while (block = unzipfile1.read(4096*4)):
p1.stdin.write(a)
p2.stdin.write(p1.stdout.read())
Это дает вывод от p1
до p2
как можно быстрее. Я сделал предположение, что p1
не будет генерировать значительно больше ввода, чем было дано. Если вывод p1
будет в десять раз больше, чем ввод, то вы должны сделать еще один цикл, похожий на этот.
Но, я должен сказать, это похоже на дополнительную работу по копированию сценария оболочки:
gzip -cd file1.gz file2.gz file3.gz | dataclean.py | dataprocess.pl
gzip(1)
будет автоматически обрабатывать передачу данных размером с блок, как я описал выше, и при условии, что ваши dataclean.py
и dataprocess.pl
сценарии также работают с данными в блоках, а не выполняют полное чтение (как и в оригинальной версии этого скрипта), тогда все они должны работать параллельно, в меру своих возможностей.