2016-04-27 5 views
0

В настоящее время я участвую в проекте Python, который включает обработку огромных объемов данных. В этом случае я должен печатать огромное количество данных в файлах. Они всегда однострочные, но иногда состоящие из миллионов цифр.Python 3 - Быстрая печать и ввод-вывод

Фактические математические операции в Python занимают всего несколько секунд, минут максимум. Печать их в файл занимает до нескольких часов; которые у меня не всегда есть.

Есть ли способ ускорения ввода-вывода?
Из того, что я считаю, число хранится в ОЗУ (или, по крайней мере, я предполагаю, что это единственное, что заняло бы 11 ГБ ОЗУ), но Python не печатает его в текстовый файл немедленно. Есть ли способ сбросить эту информацию - если это число - в файл? Я пробовал Дамп Диспетчера задач, который дал мне файл дампа 22 ГБ (Да, вы читали это правильно), и не похоже, что я там искал, хотя это было не очень понятно.

Если это имеет значение, у меня есть Python 3.5.1 (Anaconda и Spyder), операционная система Windows 8.1 x64 и 16GB.

Кстати, я запускаю сборщик мусора (модуль gc) внутри скрипта, и я удаляю переменные, которые не нужны, поэтому эти 11GB не просто неактивны.

+0

Записывается ли он на терминал или в файл? –

+0

@ TadhgMcDonald-Jensen Текстовый файл. –

+0

hmmm, вы могли бы отправить данные, которые должны быть записаны в очередь, и еще один поток, обрабатывающий IO, но я не уверен, что это поможет. –

ответ

0

Если вы действительно связаны с вводом-выводом на время записи файла, многопоточность с пулом потоков может помочь. Конечно, для этого есть предел, но, по крайней мере, это позволит вам выпускать неблокирующие записи файлов.

+0

Я бы рекомендовал показывать (или добавлять ссылки) примеры безопасного использования асинхронного ввода-вывода, так как это может быть легко испортить файлы, если нет правильно обработано. –

+0

Я пробовал многопоточность без большой удачи, однако, возможно, это был пример плохого кодирования. Помимо этого, я никогда не был слишком знаком с многопоточными процессами. Как вы предлагаете мне это сделать? –

0

Многопоточность может ускорить его (у вас есть принтеры на других потоках, которые вы записываете в память, имеющую очередь).

Возможно, точка зрения системного дизайна, но, возможно, оценивает, нужно ли писать все в файл. Возможно, рассмотрите возможность создания различных уровней ведения журнала, чтобы режим выпуска мог работать быстрее (если это имеет смысл в вашем контексте).

+0

Единственный способ, которым я мог бы упростить свои данные, - показать его как экспонента, но тогда я потеряю точность, которую я не могу разрешить. Однако это интересная идея. Как вы предлагаете мне создавать разные регистраторы? –

0

формат файла Использование HDF5

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

Формат HDF5 очень эффективен по размеру и обеспечивает доступ к нему различными инструментами.

Будьте готовы в течение нескольких проблем:

  • есть несколько пакетов питона для hdf5, вы должны найти тот, который соответствует вашим потребностям
  • установки является не всегда очень просто (но может быть для Windows установка двоичного кода)
  • ожидайте немного изучения, чтобы понять структуры данных, которые необходимо сохранить.
  • иногда потребуются некоторые циклы процессора - как правило, вы быстро записываете много данных и в какой-то момент его необходимо очистить на диске. В этот момент он начинает сжимать данные, что может занять несколько секунд. См GIL for IO bounded thread in C extension (HDF5)

Во всяком случае, я думаю, это очень вероятно, вы будете управлять и обособленно быстрее записывает файлы, которые вы также получите файлы меньшего размера, которые проще в обращении.

Смежные вопросы