Threading / Multiprocessing - поиск по 60-гигабайтному файлу с 600-тысячными терминами - PullRequest
1 голос
/ 07 апреля 2020

У меня есть сценарий python, для выполнения которого требуется ~ 93 дня на 1 процессоре или 1,5 дня на 64.

У меня большой файл (FOO.sdf) и я хочу извлечь «записи» из FOO.sdf, которые соответствуют шаблону. «Запись» - это блок из ~ 150 строк, разделенных символом «$$$$». Требуемый вывод составляет 600 тыс. Блоков ~ 150 строк. Этот скрипт у меня сейчас показан ниже. Есть ли способ использовать многопроцессорность или многопоточность, чтобы разделить эту задачу на множество ядер / процессоров / потоков? У меня есть доступ к серверу с 64 ядрами.

name_list = []
c=0

#Titles of text blocks I want to extract (form [...,'25163208',...])
with open('Names.txt','r') as names:
    for name in names:
        name_list.append(name.strip())

#Writing the text blocks to this file
with open("subset.sdf",'w') as subset:

    #Opening the large file with many textblocks I don't want
    with open("FOO.sdf",'r') as f:

        #Loop through each line in the file
        for line in f:

            #Avoids appending extreanous lines or choking 
            if line.split() == []:
                continue

            #Simply, this line would check if that line matches any name in "name_list".
            #But since I expect this is expensive to check, I only want it to occur if it passes the first two conditions.
            if ("-" not in line.split()[0]) and (len(line.split()[0]) >= 5) and (line.split()[0] in name_list):
                c=1 #when c=1 it designates that line should be written

            #Write this line to output file
            if c==1:
                subset.write(line)

            #Stop writing to file once we see "$$$$"
            if c==1 and line.split()[0] == "$$$$":
                c=0
                subset.write(line)
...