Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2013 16:11:14

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа с файлами

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

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


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

P.S. Первое, что приходит в голову - это использовать threads и глобальный список уже обрабатывающихся файлов. То есть поток находит файл, проверяет есть ли он в списке. Если есть, то ищет дальше, если нет, то добавляет его в список и начинает разбирать, а после разбора удалять из списка. Но… терзают сомнения.



————————–
Истина где-то рядом

Отредактировано alexbadaloff (Апрель 11, 2013 16:12:06)

Офлайн

#2 Апрель 11, 2013 16:20:12

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Работа с файлами

Один поток ищет файлы, складывает их в очередь. n-количество потоков ждут появление файла в очереди, забирают, обрабатывают.



Отредактировано Soteric (Апрель 11, 2013 16:20:43)

Офлайн

#3 Апрель 11, 2013 16:25:04

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа с файлами

Спасибо. Вроде понял. Буду пробовать.



————————–
Истина где-то рядом

Офлайн

#4 Апрель 11, 2013 19:12:39

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Работа с файлами

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 это список файлов который можно сформировать обычным кодом на питоне



Отредактировано doza_and (Апрель 11, 2013 19:20:11)

Офлайн

#5 Апрель 12, 2013 00:33:41

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа с файлами

Насколько я понял scons не поддерживает python3.3, который я использую.
Но информация интересная.



————————–
Истина где-то рядом

Офлайн

#6 Апрель 12, 2013 07:16:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Работа с файлами

:)

alexbadaloff
python3.3, который я использую
Это проблема поставить питон 2.7? Это быстрый и эффективный путь, со временем и сконс переползет на python 3. Конечно правильный путь внести свой вклад и принять участие в переписывании scons на трешку.



Офлайн

#7 Апрель 16, 2013 16:43:33

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа с файлами

doza_and
Это проблема поставить питон 2.7? Это быстрый и эффективный путь, со временем и сконс переползет на python 3. Конечно правильный путь внести свой вклад и принять участие в переписывании scons на трешку.

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



————————–
Истина где-то рядом

Офлайн

#8 Апрель 16, 2013 20:59:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Работа с файлами

alexbadaloff
когда будут за плечами хотя бы пару лет
Пожелаю успеха.
Хочу обратить внимание на следующее:
Вам следует подробнее описать задачу.
Если у вас основное время занимает обработка файла, и эта обработка идет средствами питона, то лучше использовать multiprocessing (сконс тоже запустит несколько процессов).
Посмотрите примеры http://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue
Обратите внимание на map_async apply_async. Не делайте количество процессов больше чем количество коннекшенов которое может пережить ваша база.



Офлайн

#9 Апрель 17, 2013 08:38:22

alexbadaloff
От: Иваново
Зарегистрирован: 2013-04-11
Сообщения: 198
Репутация: +  16  -
Профиль   Отправить e-mail  

Работа с файлами

Благодарю за хороший ответ. Это именно то, что я и хотел узнать.



————————–
Истина где-то рядом

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version