Форум сайта python.su
0
Привет.
В общем, стоит задача по записи массива строк в несколько файлов одновременно по частям.
Например, имеется общий массив с 3 миллионами строк. Надо разбить на три части (по миллиону) и записать каждую в отдельный файл, причем записывать параллельно, т.к. очень много времени уходит на это. Думаю, что надо использовать multiprocessing, но т.к. опыта работы с ним у меня нет, хотелось бы получить элементарный пример. Плюсиками и благодарностями не обижу =)
Отредактировано Galvanize (Март 24, 2014 23:24:28)
Офлайн
253
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)
Отредактировано doza_and (Март 24, 2014 21:43:47)
Офлайн
0
общий массив делим, например, на три части. Можно в цикле создавать части, например по ляму, и отправлять в функцию записи, которая должна работать в отдельном процессе, что бы все части записывались параллельно, а не по очереди.
Или можно сразу вызывать функцию записи в нескольких процессах, и уже в самой функции через pop() получать строки для чанков(частей) (если это не вызовет конфликта между процессами и вообще).
Задача разбить огромный файл с несколькими миллионами строк на отдельные равномерные файлы ( с кол-вом строк равным миллиону), как можно быстрее.
Отредактировано Galvanize (Март 24, 2014 21:31:46)
Офлайн
253
GalvanizeСильно подозреваю что тут критический участок будет чтение запись на диск. Если у вас одно устройство записи как вы ускорите запись?
все части записывались параллельно, а не по очереди.
Galvanizeвообще не приемлю. Так можно и несколько миллионов долларов на нее потратить, разработать спец аппаратуру разбиения и так далее… При такой постановке задача никогда не будет решена, поскольку всегда можно что-то усовершенствовать.
как можно быстрее
Отредактировано doza_and (Март 24, 2014 21:48:53)
Офлайн
0
doza_andприм маленьком кол-ве общих строк и строк в чанках, разумеется он выполнится быстро. Но как только дело дойдет до миллионов, то ждать записи только в один файл приходится долго.
Что такое долго? У меня код выполняется пару секунд. Это долго?
Отредактировано Galvanize (Март 24, 2014 21:51:37)
Офлайн
253
Galvanizeвсе равно неясно. Должно быть точно по миллиону или можно примерно? Если примерно, тогда можно еще быстрее сделать - читать блоками заданного размера и писать с выравниванием по границе строк.
с кол-вом строк равным миллиону
Офлайн
253
GalvanizeЯ сделал 3 миллиона строк как вы и просили.
прим маленьком кол-ве общих строк
Офлайн
253
GalvanizeВы свой код приведите. Строки понятие растяжимое. Может у вас каждая строка мегабайт?
Причем запись в один файл длится около 2-4 минут.
Отредактировано doza_and (Март 24, 2014 22:02:59)
Офлайн
0
Да, действительно. Ваш код быстро справляется. Значит я что-то не так сделал =). Спасибо большое, попробую применить ваш пример.
upd. я делал построчную запись в цикле, когда можно было сразу всё записать. Протупил.
Отредактировано Galvanize (Март 24, 2014 23:25:25)
Офлайн