Использование ресурсов в файле для чтения / записи с python, опций и соображений - PullRequest
2 голосов
/ 25 ноября 2010

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

Представьте себе, что вы пытаетесь использовать данные, хранящиеся в нескольких простых файлах, во многих случаях с общим размером, превышающим 20-35 ГБ. В самом общем случае эти файлы могут быть разделены (csv, tab) или могут иметь фиксированную ширину. Цель состоит в том, чтобы взять эти файлы или некоторое подмножество каждого файла, проанализировать входные данные (каждый столбец представляет переменную в данных) и отправить их в какой-либо пункт назначения (это может быть локальный или удаленный sql, какой-то другой локальный файл из множества выходных форматов, включая текст или какой-либо другой собственный формат данных, такой как stata's .dta)

Цель состоит в том, чтобы использовать доступные системные ресурсы для выполнения этой операции максимально быстрым способом (я полагаю, в КБ в секунду?)

Вопросы:

  1. Есть ли выигрыш в эффективности от использования скомпилированного C для выполнения операций чтения? Если да, то какую библиотеку я должен научиться использовать? И должен ли c также выполнять разбор и вывод?

  2. Если файл поставляется в формате .zip или .gz, должен ли распаковываться весь файл перед чтением и записью, или вы оставляете его сжатым и используете библиотеку, способную читать из сжатого файла?

  3. Должна ли программа использовать многопоточность? Я представляю себе чтение некоторого подмножества файла (скажем, n строк за раз), анализ и вывод, скажем, в j потоков. Не очевидно, что чтение файла по одной строке за раз является оптимальным ... и кажется, что оптимальное количество потоков и процессов будет зависеть от доступных ресурсов и размера задания.
    Поэтому, возможно, код должен быть достаточно «умным», чтобы оптимально определить, сколько потоков использовать и сколько работы должен выполнять каждый поток.

  4. Как можно измерить и сравнить эффективность между различными методами?

  5. Должна ли программа делать это динамически и выбирать методы ввода-вывода в зависимости от их производительности? (Будет ли метод A всегда строго доминировать в методе B, или будут иметь свои особенности изменения среды развертывания)

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

Я надеюсь, что эти вопросы дают четкое представление о том, что я пытаюсь выяснить. Мой опыт программирования в основном ограничен научными / статистическими пакетами, поэтому, если любой из моих вопросов сводится к «rtm», пожалуйста, будьте осторожны и предложите соответствующее руководство.

1 Ответ

2 голосов
/ 25 ноября 2010

Есть ли выигрыш в эффективности от использования скомпилированного C для выполнения операций чтения?

Не совсем. Ограничением будет пропускная способность ввода / вывода, а Python использует базовые библиотеки C.

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

Во-первых, заставьте все остальное работать хорошо. Не пытайтесь уловить это заранее. Реализация Python ZipFile может обрабатывать файлы формата CSV, открывая элементы ZIP-архива без их расширения.

Это быстрее? Вы не можете знать заранее. Вы можете знать только, построив его и измерив то, что вы построили. Не скручивай руки. Это всего лишь несколько строк кода. Постройте оба.

Должна ли программа использовать многопоточность?

номер

Использовать мульти-обработку на уровне ОС.

python something.py source.zip | python part2.py | python part3.py | python part4.py >result

Это будет удивительно быстро и - без особой работы - будет использовать все доступные ресурсы ОС.

Как можно измерить и сравнить эффективность между различными методами?

Ммм ... Это глупый вопрос. Вы строите это и измеряете это. Прошедшее время является такой же хорошей мерой, как и все остальное. Если вы запутались, используйте секундомер. Шутки в сторону. Там нет магии.

Должна ли программа делать это динамически и выбирать методы ввода-вывода в зависимости от их производительности?

номер

(Будет ли метод A всегда строго доминировать в методе B, или будут иметь значение специфические изменения в среде развертывания)

Да. И да. Некоторые методы всегда более эффективны. Однако ОС адски сложна, поэтому ничто не заменит простого, гибкого, компонентного дизайна.

Создание простых частей, которые можно гибко комбинировать.

Не загибайте руки заранее. Разработайте правильную структуру данных и алгоритм, когда сможете. Когда вы не можете, просто выберите что-нибудь разумное и двигайтесь дальше. Строить что-то и настраивать гораздо проще, чем беспокоиться о деталях, только чтобы понять, что они никогда не имели значения.

  1. Построить что-нибудь.

  2. Measure.

  3. Найдите узкое место.

  4. Оптимизация * только 1064 * проверенные узкие места.

...