Использование ресурсов в файле чтения / записи с Python, опционами и соображениями

StackOverflow https://stackoverflow.com/questions/4273259

Вопрос

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

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

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

Вопросы:

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Нет.

Используйте мультифигурирование уровня ОС.

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

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

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

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

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

Нет.

(Будет метод всегда строго доминирующим методом B, или делать идиосинкратические изменения в среде развертывания материи)

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

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

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

  1. Построить что-то.

  2. Мера.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top