Есть ли способ прочитать текстовые файлы размером в ГБ быстрее, чем мой сценарий? - PullRequest
0 голосов
/ 22 января 2020

Я написал скрипт python для чтения и замены "в формате Gb нескольких текстовых файлов в папке быстро. Есть ли способ сделать это быстрее, чем мой скрипт? Можно ли выделить несколько ядер процессора для этого скрипта? когда этот скрипт запускается?

    import re
    import os

    drc = '/root/tmp'
    pattern = re.compile('"')
    oldstr = '"'
    newstr = ''

    for dirpath, dirname, filename in os.walk(drc):
        for fname in filename:
            path = os.path.join(dirpath, fname) 
            strg = open(path).read() 
            if re.search(pattern, strg):

                strg = strg.replace(oldstr, newstr) 
                f = open(path, 'w') 
                f.write(strg) 
                f.close()

1 Ответ

1 голос
/ 22 января 2020

Самое простое улучшение: прекратите использовать re и измените if re.search(pattern, strg): на if oldstr in strg:; re здесь ничего вам не покупает (это дороже, чем простой поиск по фиксированной строке).

В качестве альтернативы (и гораздо более сложно), если вы знаете кодировку файла, вы можете воспользоваться от использования модуля mmap (в частности, с методом find), чтобы избежать необходимости загружать весь файл в память и декодировать его, когда строка с умеренной вероятностью не появится на входе; просто предварительно кодируйте строку поиска и ищите необработанные двоичные данные. Примечание: это не будет работать для некоторых кодировок, где чтение необработанных байтов без выравнивания может привести к ложному положительному результату, но это будет прекрасно работать для самосинхронизирующихся кодировок (например, UTF-8) или однобайтовых кодировок (например, ASCII, latin- 1).

Наконец, при переписывании файла избегайте попадания его в память, а затем перезаписи исходного файла; помимо создания вашей программы d ie (или медленно), если размер файла превышает физическую ОЗУ, это означает, что если программа умирает после того, как начинает перезаписывать файл, вы теряете данные навсегда. Модуль tempfile можно использовать для создания временного файла в том же dir, что и исходный файл, вы можете читать построчно и заменять, как go, записывая во временный файл, пока вы не закончите. Затем просто выполните переименование atomi c из временного файла в исходное имя файла, чтобы заменить исходный файл как одну операцию (убедитесь, что это либо новые данные, либо старые данные, а не какая-то промежуточная версия данных).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...