Форум сайта python.su
0
Всем здравствуйте!
Есть небольшая программка, сортирующая файл с данными (удаляет повторяющиеся элементы).
Работает исправно. Но долго. Тачка не слабая, 4 ядра. Программулька использует только одно и то на 20-25 процентов!
Вопрос в том, как уговорить прогу кушать одно (два-три) ядро целиком или хотя бы близко к целому?
Заранее благодарю!
P.S. если интересно, файл в ~500 000 строк. Дальше будет больше.
Офлайн
14
Практически уверен, что вы упираетесь не в процессор а в память.
Полмиллиона строк зачитываются в один список, а потом оттуда удаляются нужные строчки и лишь затем список пишется в файл, верно?
Офлайн
0
Да.
P.S. multiprocessing поможет?
Офлайн
0
Я может чего-то не понимаю, но для машины полляма строк ведь не страшны? =) Я про память, если она быстрая и ее много =)
Отредактировано (Дек. 30, 2010 09:53:57)
Офлайн
14
Нет, не поможет.
Офлайн
0
Разбивать файл?
Офлайн
14
Скормите файл построчно в sqlite (базу можно создавать и в памяти). Выйдет дешево и сердито.
Альтернатива - самому строить множество уже использованных строк. Главное - не удалять ни в коем случае, только добавлять.
И использовать множество, которое на хешах - а не список.
Офлайн
0
Сами операции ввода\вывода все равно остаются довольно дорогими и долгими: извечная проблема отставания интерфейсов обмена данными от скорости работы ЦПУ. Оно и понятно,если в ОЗУ там хоть просто надо рассчитать адрес ячеек и послать управляющие сигналы на считывание, что вобщем то то же не так чтоб супербыстро, то с жестким диском все гораздо дольше. А ведь насколько я понимаю программа работает при синхронном режиме ввода\вывода, то она ждет пока все будет считано.
Вам бы функцию-гненератор , которая считывала бы небольшими порциями. Возможно Вам помогут еще сопрограммы
Офлайн
0
А вот вариант Андрея более правильный))
Офлайн
0
guranvir Спасибо за разъяснения.
Андрей, если Вас не затруднит, можно поподробнее?
list = open(“/home/файл”, “r”).readlines() разве не читает фесь файл разом в ОЗУ?
# -*- coding: utf8 -*- #
import sys
list = open("/home/file.fl", "r").readlines()
list2 = open("/home/file2.fl", "w")
# проверка наличия повторяющихся элемнетов
for i in xrange(len(list)-1, -1, -1):
if list.count(list[i]) != 1:
del list[i]
# сохранение результата в файл
for line in list:
list2.write(line)
list.close()
list2.close()
sys.exit()
Отредактировано (Дек. 30, 2010 10:17:28)
Офлайн