Есть ли более быстрый способ проверить, есть ли в текстовом файле две строки? - PullRequest
0 голосов
/ 25 февраля 2020

Я разрабатываю скрипт для чтения журналов в папке журналов и проверки каждого файла журнала .txt:

1), если в журнале есть строка «FileData» и
2), если В журнале нет строки «Ошибка в данных файла»

Если это условие выполнено, ему необходимо прочитать файл и собрать содержимое строки 2. После некоторого исследования topi c я обнаружил, что Решение проблемы и сценарий ниже работает. Проблема заключается в том, что чтение 3000 файлов занимает ~ 20 минут, а с учетом ожидаемого очень быстрого роста числа файлов это решение невозможно.

import os
import mmap
Dict = {}

for log in sorted(os.listdir(log_folder)):
        with open(os.path.join(log_folder, log), 'r') as f: 
            s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
            if s.find(b'FileData') != -1 and s.find(b'Error in FileData') == -1:
                lines = [line for line in islice(f, 2)][:1]
                content = lines[1]
                Dict[log] = content

Если я запускаю это только с первой находкой ('FileData) , это очень быстро, но момент, когда я добавил второе время поиска («Ошибка в FileData»), увеличился не линейно. Есть ли другой способ выполнить то же действие, но более быстрым? Я пробовал re.findall () и readlines (), но результат был слишком похож на этот.

Спасибо!

1 Ответ

1 голос
/ 25 февраля 2020

Если шейка bottle вызвана операциями ввода-вывода, то многопоточность должна привести к увеличению скорости. Не проверено.

import os
import threading
import mmap
Dict = {}

for log in sorted(os.listdir(log_folder)):
    threading.Thread(target=operate, args=(os.path.join(log_folder, log),)).start()

def operate(file):
    with open(file, 'r') as f: 
        s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
        if s.find(b'FileData') != -1 and s.find(b'Error in FileData') == -1:
            lines = [line for line in islice(f, 2)][:1]
            content = lines[1]
            Dict[log] = content
...