Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 7, 2015 12:44:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

PDA
Функция Put до запуска потоков уже заполнила очередь файлами, зачем её в отдельный поток выводить?
Если там файлов много, то во время их поиска уже должна происходить обработка первого найденного.

PDA
Задача следующая:
есть папка- размер около 3 Гигабайт, в папке лежат файлы со статистикой, файлы могут быть от 300 Кб до 3 Мб.
А файлов много.



Офлайн

#2 Дек. 7, 2015 12:51:02

PDA
Зарегистрирован: 2015-12-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

py.user.next
PDA
Функция Put до запуска потоков уже заполнила очередь файлами, зачем её в отдельный поток выводить?

Если там файлов много, то во время их поиска уже должна происходить обработка первого найденного.

PDA
Задача следующая:
есть папка- размер около 3 Гигабайт, в папке лежат файлы со статистикой, файлы могут быть от 300 Кб до 3 Мб.

А файлов много.
Файлов много конкретно за вчера 2305

Я наверное не правильно поставил задачу. Скорость обработки файлов при моей реализации на нужном уровне, не спорю наверняка можно ещё быстрей, но у меня уже такой задачи не стоит. Проблема в том что каждый поток выводит свой результат. то есть по факту у меня получается 10 значений, а нужно одно. Фактически это сумма этих 10 значений. Но попытка присвоить результат вывода потока переменной не увенчалась успехом.

Офлайн

#3 Дек. 7, 2015 13:09:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

PDA
Файлов много конкретно за вчера 2305
Как только он путь добавил в очередь, тот сразу должен быть взят и передан на обработку (изъят из очереди). Иначе память будет занята этими путями.
Он ещё последний путь не найдёт, а уже обработает ряд файлов и их результаты прибавит к общему результату.

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

PDA
Но попытка присвоить результат вывода потока переменной не увенчалась успехом.
То, что ты запостил вначале, - это вообще не паралелльная программа. В параллельной программе всё должно одновременно выполняться, и там нет никаких “это произошло первее, а это произошло вторее”.



Отредактировано py.user.next (Дек. 7, 2015 13:11:06)

Офлайн

#4 Дек. 7, 2015 13:21:39

PDA
Зарегистрирован: 2015-12-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

py.user.next
То, что ты запостил вначале, - это вообще не паралелльная программа. В параллельной программе всё должно одновременно выполняться, и там нет никаких “это произошло первее, а это произошло вторее”.


Напиши пожалуйста, что конретно надо исправить или добавить в моей реализации. Судя по твоим словам вопрос пары строчек.

Офлайн

#5 Дек. 7, 2015 13:42:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

PDA
что конретно надо исправить или добавить в моей реализации
Ну, вот алгоритм описан.
То есть твой вариант нужно просто удалить и написать заново, ещё и под присмотром.

PDA
    os.chdir(goal_dir)
    print(os.getcwd())
    dir_list = os.listdir(os.getcwd())
Это же просто быдлокод какой-то. Если надо просмотреть текущий каталог, просто запускается os.listdir() без аргументов.
>>> import os
>>> 
>>> os.listdir()
['algo', 'ev_ex1.py', 'examples', 'web', 'sys', 'xmlcmp', 't.py', '.directory']
>>>
Да и переходы по каталогам через os.chdir() мало где практикуются. Надо составлять путь через os.path.join().



Отредактировано py.user.next (Дек. 7, 2015 13:48:50)

Офлайн

#6 Дек. 7, 2015 21:13:18

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

Сбор результатов выполнения потоков в одном месте

Уважаемый, а можно кусочек файла получить. И поясните пожалуйста что вы делаете. Складывается впечатление что вы пересчитываете поля. Возможно я могу написать такой агрегатор на numpy который не потребует плясок с распараллеливанием. Поясню. для таких алгоритмов обычно получается что их скорость ограничена скоростью считывания данных с жесткого диска (если у вас не SSD) и в этом случае параллель не параллель а физически скорость ограничена шиной. У вас это похоже не так. Можно попробовать поправить.

p.s.
Конечно chdir и параллельное выполнение ну никак не совместимы как вам и указывают.



Отредактировано doza_and (Дек. 7, 2015 21:15:13)

Офлайн

#7 Дек. 8, 2015 08:06:24

PDA
Зарегистрирован: 2015-12-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

doza_and
Уважаемый, а можно кусочек файла получить. И поясните пожалуйста что вы делаете. Складывается впечатление что вы пересчитываете поля. Возможно я могу написать такой агрегатор на numpy который не потребует плясок с распараллеливанием. Поясню. для таких алгоритмов обычно получается что их скорость ограничена скоростью считывания данных с жесткого диска (если у вас не SSD) и в этом случае параллель не параллель а физически скорость ограничена шиной. У вас это похоже не так. Можно попробовать поправить.p.s.Конечно chdir и параллельное выполнение ну никак не совместимы как вам и указывают.

Спасибо за помощь, но вопрос решился крайне просто. В функции main, где я вызываю потоки нужно было добавить метод join(). После добавления метода программа дожидалась окончания работы каждого потока, а результат складывала. То что мне и нужно было.

Офлайн

#8 Дек. 8, 2015 08:24:17

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

Сбор результатов выполнения потоков в одном месте

PDA
но вопрос решился крайне просто.
Поздравляю. Если вас устраивает, то все ок. Но я так понимаю что вы остановились на времени порядка 3-5 минут, а скорее всего можно добиться 1-2 минуты и используя только одно ядро. :)



Отредактировано doza_and (Дек. 8, 2015 08:25:14)

Офлайн

#9 Дек. 8, 2015 08:45:43

PDA
Зарегистрирован: 2015-12-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

doza_and
Поздравляю. Если вас устраивает, то все ок. Но я так понимаю что вы остановились на времени порядка 3-5 минут, а скорее всего можно добиться 1-2 минуты и используя только одно ядро.
Именно- в среднем 4 минуты выходит. Два вопроса:
1) numpy это нестандартная библиотека? Я не нашёл описание на python.org
2) есть ли эта библеотека для питона 2,6

Офлайн

#10 Дек. 8, 2015 08:49:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Сбор результатов выполнения потоков в одном месте

PDA
Если не с кем побеседовать, то всегда есть отличный собеседник



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version