yield не возвращает содержимое файла из больших файлов, почему? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь мультипроцессировать один из моих скриптов.Сценарий считывает все данные из файла и записывает в другой файл соответствующие строки (например, все ученики, чье имя - Джейкоб).

Исходный сценарий:

search_val = "jacob"
with open("big_file.txt") as f:
    with open("matches.txt", "w") as f_out:
        for line in f:
            if (search_val in line.lower()):
                f_out.write(line)

ЭтоСценарий и multiprocess оба дают хорошие результаты для небольших файлов, но оригинальный сценарий также работает с нагрудными файлами.

Многопроцессный сценарий:

from multiprocessing import Pool
import threading
import time
import Queue
import sys

search_val = {"key1" : [], "key2" : [], "key3":[]}

def process_line(line):
    global search_val
    key_val_list = []
    for key in search_val.keys():
        if (key.lower() in line.lower()):
            search_val[key].append(line.strip())
            key_val_list.append({key:line})
    return key_val_list

#with open("big_file.txt") as f:
def get_lines():
    with open("small_file.txt") as f:
        yield f


if __name__ == "__main__":
    pool = Pool(8)
    file_lines = get_lines()
    start = time. time()
    end = time. time()
    #print(end - start)
    results = pool.map(process_line, next(file_lines), 8)
    #pool.close()
    #print(results)

    print("Done reading")
    end = time. time()
    print(end - start)

    with open("results.txt", "w") as f_out:
        f_out.write(str(results))

    print("Done saving results")
    end = time. time()
    print(end - start)

    print_dict= {}
    for line in results:
        for result in line:
            for key in result.keys():
                if key in print_dict.keys():
                    print_dict[key].append(result[key].strip())
                else:
                    print_dict[key] = [result[key].strip()]

    print("Done ordering")
    end = time. time()
    print(end - start)

    for key in print_dict.keys():
        with open(key+".txt", "w") as f_out:
            for val in print_dict[key]:
                f_out.write(val + "\n")

, вы можете использовать его как маленький файл:

key2@key1.co.il
key3@key1.net
key4@key1.co.uk
key5@key1.co.il

Этот сценарий отлично работает для небольших файлов, но не генерирует никаких результатов (даже не выводит «Закончено чтение») для big_file.Размер большого_файла составляет 11 ГБ.

У меня есть 2 вопроса:

  1. Использовал ли я yield так, как мне кажется?
  2. У вас есть идея, почему это не так?не работает?

Я также пытался обновить карту search_val (которая является глобальным параметром), но это тоже не сработало, поэтому я попробовал опцию списка.

Если выесть идеи, которыми вы можете поделиться.

...