Найти - Пользователи
Полная версия: Рациональное использование CPU.
Начало » Python для новичков » Рациональное использование CPU.
1 2 3 4
baragoz
Всем здравствуйте!

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

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

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


P.S. если интересно, файл в ~500 000 строк. Дальше будет больше.
Андрей Светлов
Практически уверен, что вы упираетесь не в процессор а в память.
Полмиллиона строк зачитываются в один список, а потом оттуда удаляются нужные строчки и лишь затем список пишется в файл, верно?
baragoz
Да.

P.S. multiprocessing поможет?
baragoz
Я может чего-то не понимаю, но для машины полляма строк ведь не страшны? =) Я про память, если она быстрая и ее много =)
Андрей Светлов
Нет, не поможет.
baragoz
Разбивать файл?
Андрей Светлов
Скормите файл построчно в sqlite (базу можно создавать и в памяти). Выйдет дешево и сердито.
Альтернатива - самому строить множество уже использованных строк. Главное - не удалять ни в коем случае, только добавлять.
И использовать множество, которое на хешах - а не список.
guranvir
Сами операции ввода\вывода все равно остаются довольно дорогими и долгими: извечная проблема отставания интерфейсов обмена данными от скорости работы ЦПУ. Оно и понятно,если в ОЗУ там хоть просто надо рассчитать адрес ячеек и послать управляющие сигналы на считывание, что вобщем то то же не так чтоб супербыстро, то с жестким диском все гораздо дольше. А ведь насколько я понимаю программа работает при синхронном режиме ввода\вывода, то она ждет пока все будет считано.
Вам бы функцию-гненератор , которая считывала бы небольшими порциями. Возможно Вам помогут еще сопрограммы
guranvir
А вот вариант Андрея более правильный))
baragoz
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. построчно сохраняем получившийся список из оперативки на диск в другой файл.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB