Работа с очень большими файлами в Python. Помогите найти утечку памяти
День добрый. Подскажите как обрабатывать файлы большого размера в Python. Имеется file.txt размером в 25ГБ.
Задача - отфильтровать этот файл построчно и записать в outfile.txt. Вот мой код:
import multiprocessing
def run():
file = open('file.txt', 'r')
pool = multiprocessing.Pool(processes=8)
pool.imap_unordered(work, file)
pool.close()
pool.join()
def work(line):
if len(line.strip()) >= 6:
outfile.write(line)
if __name__ == '__main__':
outfile = open('outfile.txt', 'a')
run()
outfile.close()
file.close()
Проблема заключается в том, что где-то здесь течет память. Через время программа заваливается по нехватке памяти. Помогите найти утечку памяти, или подскажите какими инструментами можно мониторить потребление памяти в программе.
Ответы (1 шт):
Насколько я понимаю, файлы не потокобезопасны в Python. А вы ведь пишете из нескольких потоков в один открытый файл. Некоторые рецепты что с этим делать можно прочесть здесь
Самое безопасное, наверное - это писать в выходной файл в одном потоке, а то, что туда нужно писать - класть в очередь в потоках. Но в вашем случае обработка данных довольно лёгкая, упираться всё будет именно в запись файла и смысла в многопоточности тут вообще нет.
Ну либо можно в каждом отдельном потоке заново открывать файл на запись, писать туда и закрывать, но ускорение от этого опять же вряд ли будет.