Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 30, 2010 09:21:12

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Всем здравствуйте!

Есть небольшая программка, сортирующая файл с данными (удаляет повторяющиеся элементы).
Работает исправно. Но долго. Тачка не слабая, 4 ядра. Программулька использует только одно и то на 20-25 процентов!

Вопрос в том, как уговорить прогу кушать одно (два-три) ядро целиком или хотя бы близко к целому?

Заранее благодарю!


P.S. если интересно, файл в ~500 000 строк. Дальше будет больше.



Офлайн

#2 Дек. 30, 2010 09:50:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

Практически уверен, что вы упираетесь не в процессор а в память.
Полмиллиона строк зачитываются в один список, а потом оттуда удаляются нужные строчки и лишь затем список пишется в файл, верно?



Офлайн

#3 Дек. 30, 2010 09:52:03

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Да.

P.S. multiprocessing поможет?



Офлайн

#4 Дек. 30, 2010 09:53:18

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Я может чего-то не понимаю, но для машины полляма строк ведь не страшны? =) Я про память, если она быстрая и ее много =)



Отредактировано (Дек. 30, 2010 09:53:57)

Офлайн

#5 Дек. 30, 2010 09:53:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

Нет, не поможет.



Офлайн

#6 Дек. 30, 2010 09:54:34

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Разбивать файл?



Офлайн

#7 Дек. 30, 2010 09:59:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Рациональное использование CPU.

Скормите файл построчно в sqlite (базу можно создавать и в памяти). Выйдет дешево и сердито.
Альтернатива - самому строить множество уже использованных строк. Главное - не удалять ни в коем случае, только добавлять.
И использовать множество, которое на хешах - а не список.



Офлайн

#8 Дек. 30, 2010 10:00:15

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

Сами операции ввода\вывода все равно остаются довольно дорогими и долгими: извечная проблема отставания интерфейсов обмена данными от скорости работы ЦПУ. Оно и понятно,если в ОЗУ там хоть просто надо рассчитать адрес ячеек и послать управляющие сигналы на считывание, что вобщем то то же не так чтоб супербыстро, то с жестким диском все гораздо дольше. А ведь насколько я понимаю программа работает при синхронном режиме ввода\вывода, то она ждет пока все будет считано.
Вам бы функцию-гненератор , которая считывала бы небольшими порциями. Возможно Вам помогут еще сопрограммы



Офлайн

#9 Дек. 30, 2010 10:01:16

guranvir
От:
Зарегистрирован: 2010-03-16
Сообщения: 186
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

А вот вариант Андрея более правильный))



Офлайн

#10 Дек. 30, 2010 10:09:56

baragoz
От:
Зарегистрирован: 2010-09-11
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Рациональное использование CPU.

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()
Проверку на повторы взял с форума =)

Правильно ли я понимаю алгоритм?

1. читаем файл в оперативку
2. пробегаемся по нему и ищем повторы (для каждой строки новый проход по всему файлу) и удаляем повторы.
3. построчно сохраняем получившийся список из оперативки на диск в другой файл.



Отредактировано (Дек. 30, 2010 10:17:28)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version