Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2014 21:21:26

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[РЕШЕНО]Запись в несколько файлов одновременно

Привет.
В общем, стоит задача по записи массива строк в несколько файлов одновременно по частям.
Например, имеется общий массив с 3 миллионами строк. Надо разбить на три части (по миллиону) и записать каждую в отдельный файл, причем записывать параллельно, т.к. очень много времени уходит на это. Думаю, что надо использовать multiprocessing, но т.к. опыта работы с ним у меня нет, хотелось бы получить элементарный пример. Плюсиками и благодарностями не обижу =)



Отредактировано Galvanize (Март 24, 2014 23:24:28)

Офлайн

#2 Март 24, 2014 21:25:53

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

[РЕШЕНО]Запись в несколько файлов одновременно

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)

Офлайн

#3 Март 24, 2014 21:29:25

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[РЕШЕНО]Запись в несколько файлов одновременно

общий массив делим, например, на три части. Можно в цикле создавать части, например по ляму, и отправлять в функцию записи, которая должна работать в отдельном процессе, что бы все части записывались параллельно, а не по очереди.
Или можно сразу вызывать функцию записи в нескольких процессах, и уже в самой функции через pop() получать строки для чанков(частей) (если это не вызовет конфликта между процессами и вообще).

Задача разбить огромный файл с несколькими миллионами строк на отдельные равномерные файлы ( с кол-вом строк равным миллиону), как можно быстрее.



Отредактировано Galvanize (Март 24, 2014 21:31:46)

Офлайн

#4 Март 24, 2014 21:45:57

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

[РЕШЕНО]Запись в несколько файлов одновременно

Galvanize
все части записывались параллельно, а не по очереди.
Сильно подозреваю что тут критический участок будет чтение запись на диск. Если у вас одно устройство записи как вы ускорите запись?

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



Отредактировано doza_and (Март 24, 2014 21:48:53)

Офлайн

#5 Март 24, 2014 21:49:53

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[РЕШЕНО]Запись в несколько файлов одновременно

doza_and
Что такое долго? У меня код выполняется пару секунд. Это долго?
прим маленьком кол-ве общих строк и строк в чанках, разумеется он выполнится быстро. Но как только дело дойдет до миллионов, то ждать записи только в один файл приходится долго.

Ну вот как бы вы поступили, будь у вас файл с 5 миллионами строк, и его надо разбить на 5 файлов с миллионом строк в каждом. Причем запись в один файл длится около 2-4 минут.



Отредактировано Galvanize (Март 24, 2014 21:51:37)

Офлайн

#6 Март 24, 2014 21:54:21

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

[РЕШЕНО]Запись в несколько файлов одновременно

Galvanize
с кол-вом строк равным миллиону
все равно неясно. Должно быть точно по миллиону или можно примерно? Если примерно, тогда можно еще быстрее сделать - читать блоками заданного размера и писать с выравниванием по границе строк.



Офлайн

#7 Март 24, 2014 21:55:06

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

[РЕШЕНО]Запись в несколько файлов одновременно

Galvanize
прим маленьком кол-ве общих строк
Я сделал 3 миллиона строк как вы и просили.



Офлайн

#8 Март 24, 2014 21:57:45

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

[РЕШЕНО]Запись в несколько файлов одновременно

Galvanize
Причем запись в один файл длится около 2-4 минут.
Вы свой код приведите. Строки понятие растяжимое. Может у вас каждая строка мегабайт?

Если критична операция чтения записи то можно использовать RAID, SSD винт или раскидать процессы чтения записи по кластеру.



Отредактировано doza_and (Март 24, 2014 22:02:59)

Офлайн

#9 Март 24, 2014 22:02:37

Galvanize
От:
Зарегистрирован: 2011-01-14
Сообщения: 67
Репутация: +  0  -
Профиль   Отправить e-mail  

[РЕШЕНО]Запись в несколько файлов одновременно

Да, действительно. Ваш код быстро справляется. Значит я что-то не так сделал =). Спасибо большое, попробую применить ваш пример.

upd. я делал построчную запись в цикле, когда можно было сразу всё записать. Протупил.



Отредактировано Galvanize (Март 24, 2014 23:25:25)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version