Galvanize
Март 24, 2014 21:21:26
Привет.
В общем, стоит задача по записи массива строк в несколько файлов одновременно по частям.
Например, имеется общий массив с 3 миллионами строк. Надо разбить на три части (по миллиону) и записать каждую в отдельный файл, причем записывать параллельно, т.к. очень много времени уходит на это. Думаю, что надо использовать multiprocessing, но т.к. опыта работы с ним у меня нет, хотелось бы получить элементарный пример. Плюсиками и благодарностями не обижу =)
doza_and
Март 24, 2014 21:25:53
Galvanize
Надо разбить на три части (по миллиону)
Как разбить? Примерно на три равные части? или надо обязательно через одну делать? На первый взгляд multiprocessing тут не поможет.
Что такое долго? У меня код выполняется пару секунд. Это долго?
data=open("o.dat","r").readlines()
for i in range(3):
d1="".join(data[i::3])
with open("o{0}.dat".format(i),"w") as f:
f.write(d1)
Galvanize
Март 24, 2014 21:29:25
общий массив делим, например, на три части. Можно в цикле создавать части, например по ляму, и отправлять в функцию записи, которая должна работать в отдельном процессе, что бы все части записывались параллельно, а не по очереди.
Или можно сразу вызывать функцию записи в нескольких процессах, и уже в самой функции через pop() получать строки для чанков(частей) (если это не вызовет конфликта между процессами и вообще).
Задача разбить огромный файл с несколькими миллионами строк на отдельные равномерные файлы ( с кол-вом строк равным миллиону), как можно быстрее.
doza_and
Март 24, 2014 21:45:57
Galvanize
все части записывались параллельно, а не по очереди.
Сильно подозреваю что тут критический участок будет чтение запись на диск. Если у вас одно устройство записи как вы ускорите запись?
Постановку задачи
Galvanize
как можно быстрее
вообще не приемлю. Так можно и несколько миллионов долларов на нее потратить, разработать спец аппаратуру разбиения и так далее… При такой постановке задача никогда не будет решена, поскольку всегда можно что-то усовершенствовать.
Galvanize
Март 24, 2014 21:49:53
doza_and
Что такое долго? У меня код выполняется пару секунд. Это долго?
прим маленьком кол-ве общих строк и строк в чанках, разумеется он выполнится быстро. Но как только дело дойдет до миллионов, то ждать записи только в один файл приходится долго.
Ну вот как бы вы поступили, будь у вас файл с 5 миллионами строк, и его надо разбить на 5 файлов с миллионом строк в каждом. Причем запись в один файл длится около 2-4 минут.
doza_and
Март 24, 2014 21:54:21
Galvanize
с кол-вом строк равным миллиону
все равно неясно. Должно быть точно по миллиону или можно примерно? Если примерно, тогда можно еще быстрее сделать - читать блоками заданного размера и писать с выравниванием по границе строк.
doza_and
Март 24, 2014 21:55:06
Galvanize
прим маленьком кол-ве общих строк
Я сделал 3 миллиона строк как вы и просили.
doza_and
Март 24, 2014 21:57:45
Galvanize
Причем запись в один файл длится около 2-4 минут.
Вы свой код приведите. Строки понятие растяжимое. Может у вас каждая строка мегабайт?
Если критична операция чтения записи то можно использовать RAID, SSD винт или раскидать процессы чтения записи по кластеру.
Galvanize
Март 24, 2014 22:02:37
Да, действительно. Ваш код быстро справляется. Значит я что-то не так сделал =). Спасибо большое, попробую применить ваш пример.
upd. я делал построчную запись в цикле, когда можно было сразу всё записать. Протупил.