Найти - Пользователи
Полная версия: Работа с файлами
Начало » Python для новичков » Работа с файлами
1
alexbadaloff
Прошу дать совет по следующему вопросу:
У меня есть программа (написана на freepascal), хочу переписать ее на Python. Суть программы сканить папки на наличие файлов с нужным расширением, их разборе и импорте в БД. Она работает упрощенно так:

1) Находим файл.
2) Обрабатываем.
3) Перемещаем.
4) Ищем следующий файл.


Я задумался над оптимизацией, а точнее, чтобы обрабатывать по 5 (например) файлов параллельно (независимо).
Я понимаю, что можно запустить нити(multi-threads) или (multi-processing), которые будут работать независимо…
Но как они могут между собой взаимодействовать и понимать кому какой файл? Каким образом можно это осуществить?

P.S. Первое, что приходит в голову - это использовать threads и глобальный список уже обрабатывающихся файлов. То есть поток находит файл, проверяет есть ли он в списке. Если есть, то ищет дальше, если нет, то добавляет его в список и начинает разбирать, а после разбора удалять из списка. Но… терзают сомнения.
Soteric
Один поток ищет файлы, складывает их в очередь. n-количество потоков ждут появление файла в очереди, забирают, обрабатывают.
alexbadaloff
Спасибо. Вроде понял. Буду пробовать.
doza_and
1 Часто узкое звено не обработчик файла а субд. Рекомендую сначала убедиться что игра стоит свеч.
2 Задачи по обработке файлов иногда удобно решать build системами.

если любите питон используйте scons: http://www.scons.org/
SConstruct
bld = Builder(action = 'foobuild < $SOURCE > $TARGET',
                     suffix = '.done',
                     src_suffix = '.myfile')
env = Environment(BUILDERS = {'Foo' : bld})
filelist=[....]
res=[env.Foo(i) for i in filelist]

Надо чтобы в результате обработки файла aaa.myfile получился файл метка aaa.done
А дальше просто пишете
scons -j 20 и получаете импорт в 20 потоков
Бесплатный бонус - все легко повторить. scons -c и вы опять готовы отлаживать импорт.
filelist это список файлов который можно сформировать обычным кодом на питоне
alexbadaloff
Насколько я понял scons не поддерживает python3.3, который я использую.
Но информация интересная.
doza_and
:)
alexbadaloff
python3.3, который я использую
Это проблема поставить питон 2.7? Это быстрый и эффективный путь, со временем и сконс переползет на python 3. Конечно правильный путь внести свой вклад и принять участие в переписывании scons на трешку.
alexbadaloff
doza_and
Это проблема поставить питон 2.7? Это быстрый и эффективный путь, со временем и сконс переползет на python 3. Конечно правильный путь внести свой вклад и принять участие в переписывании scons на трешку.

Правильней не придумаешь, когда будут за плечами хотя бы пару лет плотного программирования на питоне с использованием сконс коих у меня совсем нет.
doza_and
alexbadaloff
когда будут за плечами хотя бы пару лет
Пожелаю успеха.
Хочу обратить внимание на следующее:
Вам следует подробнее описать задачу.
Если у вас основное время занимает обработка файла, и эта обработка идет средствами питона, то лучше использовать multiprocessing (сконс тоже запустит несколько процессов).
Посмотрите примеры http://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue
Обратите внимание на map_async apply_async. Не делайте количество процессов больше чем количество коннекшенов которое может пережить ваша база.
alexbadaloff
Благодарю за хороший ответ. Это именно то, что я и хотел узнать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB