Альтернативы ограничениям памяти Python Popen.communicate ()?

У меня есть следующий фрагмент кода Python (работает v2.7), который приводит к MemoryError исключения из MemoryError при работе с большими (несколькими GB) файлами:

 myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE) myStdout, myStderr = myProcess.communicate() sys.stdout.write(myStdout) if myStderr: sys.stderr.write(myStderr) 

При чтении документации к Popen.communicate() происходит некоторая буферизация:

Примечание . Чтение данных буферизуется в памяти, поэтому не используйте этот метод, если размер данных является большим или неограниченным.

Есть ли способ отключить эту буферизацию или заставить кеш периодически очищаться во время процесса?

Какой альтернативный подход я должен использовать в Python для запуска команды, которая передает гигабайты данных в stdout ?

Я должен отметить, что мне нужно обрабатывать потоки вывода и ошибок.

  • Установите lxml в качестве парсера BeautifulSoup по умолчанию
  • Установка gstreamer 1.0 на windows для python 2.7.
  • Эффективное сопоставление строк в Apache Spark
  • Прокси-сервер Python не обрабатывает запросы POST
  • Как включить эхо-код в виде звездочек
  • «import sitecustomize» не удался при запуске spyder
  • Python: Как создать уникальное имя файла?
  • Предупреждение при сохранении возможности в OpenERP
  • 2 Solutions collect form web for “Альтернативы ограничениям памяти Python Popen.communicate ()?”

    Думаю, я нашел решение:

     myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE) for ln in myProcess.stdout: sys.stdout.write(ln) for ln in myProcess.stderr: sys.stderr.write(ln) 

    Похоже, что мое использование памяти достаточно, чтобы справиться с задачей.

    Обновить

    Недавно я нашел более гибкий способ передачи потоков данных в Python с использованием потоков . Интересно, что Python настолько беден в чем-то, что скрипты оболочки могут делать так легко!

    То, что я, вероятно, сделал бы, вместо этого, если бы мне нужно было прочитать stdout для чего-то большого, отправляет его в файл при создании процесса.

     with open(my_large_output_path, 'w') as fo: with open(my_large_error_path, 'w') as fe: myProcess = Popen(myCmd, shell=True, stdout=fo, stderr=fe) 

    Изменить: если вам нужно потоковое, вы можете попробовать создать файл-подобный объект и передать его в stdout и stderr. (Я еще не пробовал это.) Затем вы могли читать (запрос) с объекта, когда он записывается.

    Interesting Posts

    Catch "socket.error: Соединение отказало" исключение

    Python загружает json-файл с заголовком спецификации UTF-8

    Как получить список переменных в определенном модуле Python?

    gdb-python: анализируя структуру каждого поля и печатая их с правильным значением, если существует

    Задача запроса async для BigQuery – метод fetch_results () возвращает неверное количество значений

    Как определить, какая установка Python используется интерпретатором?

    Как я могу использовать scipy.ndimage.interpolation.affine_transform для поворота изображения вокруг своего центра?

    Взаимодействие с программой после выполнения

    Техника сравнения строк, используемая Python

    разница между dict (groupby) и groupby

    Размещение графика в главном окне Tkinter в Python

    SQLAlchemy: создать запрос на удаление с помощью самообучения в MySQL

    числовой сортировать столбец, содержащий числа и строки (pandas / python)

    Обновление списка

    Как сортировать 2 элементарный набор строк в смешанном порядке Используя ключевой параметр (не cmp)

    Python - лучший язык программирования в мире.