Top.Mail.Ru
Ответы
Аватар пользователя

syfaren_m

SYFAREN m
подписчиков

Значения кармы
мнения
знания
истории
Аватар пользователя
5 месяцев назад
от
Подсчет слов в огромном файле с помощью многопоточности и очередей (multiprocessing)

Привет всем! Занимаюсь обработкой огромного текстового файла (несколько гигабайт) на Python. Нужно посчитать, сколько раз встречается каждое слово. Проблема в том, что если просто идти построчно, это занимает очень много времени.

Думаю, можно ускорить всё с помощью многопоточности и очередей. Вот моя идея:

1. Разбить файл на несколько частей.
2. Запустить несколько потоков, каждый обрабатывает свою часть и считает слова. Результаты (слово: количество) каждый поток отправляет в очередь.
3. Главный поток собирает результаты из очереди и объединяет их в один словарь.

Написал код, но он работает как-то странно - то неправильный результат выдаёт, то вообще зависает. Не могу понять, где ошибка и как правильно использовать multiprocessing.Queue и multiprocessing.Process. Хочется, чтобы и память не жрало, и работало быстро.

Вот что у меня пока есть:


import multiprocessing
import os

def process_chunk(filename, start_byte, end_byte, queue):
# ... (тут код обработки куска файла) ...

def main():
filename = "huge_file.txt"
filesize = os.path.getsize(filename)
num_processes = multiprocessing.cpu_count()
chunk_size = filesize // num_processes

queue = multiprocessing.Queue()
processes = []

for i in range(num_processes):
start_byte = i * chunk_size
end_byte = (i + 1) * chunk_size
if i == num_processes - 1:
end_byte = filesize # Последний кусок может быть неполным

process = multiprocessing.Process(target=process_chunk, args=(filename, start_byte, end_byte, queue))
processes.append(process)
process.start()

# ... (тут код, который собирает результаты из очереди) ...

for process in processes:
process.join()

if __name__ == "__main__":
main()



Буду очень благодарен за помощь!

Аватар пользователя
1 год назад
от
Просто маленький текст о жизни и смерти

Жизнь и смерть - две неотъемлемые части нашего существования. Вечный круговорот, который начинается с первого вздоха и заканчивается последним. Жизнь - это как бесконечное путешествие, полное радости и боли, любви и потерь, успехов и неудач. Мы стремимся найти смысл и цель в этом мире, пытаемся оставить свой след во времени, оставить что-то после себя.

Смерть же приходит как неизбежный конец этого пути. Она как таинственная часть жизни, которую мы не можем понять или объяснить. Она приходит в разное время и в разных обстоятельствах, оставляя за собой горечь утраты и пустоту. Но в то же время, смерть - это естественное завершение жизни, переход в другое состояние, новое начало.

И все же, несмотря на бесконечный круговорот жизни и смерти, каждый момент, каждый вдох и выдох ценны. Они делают нашу жизнь уникальной и неповторимой. Важно ценить каждый день, каждый момент с близкими и дорогими людьми, стремиться к счастью и исполнению своих мечт. И, возможно, самый главный урок, который нам дает жизнь и смерть - это ценить и любить друг друга, потому что в конечном итоге, это единственное, что остается после нас.