Python 有没有办法比我的脚本更快地读取GB大小的文本文件?

Python 有没有办法比我的脚本更快地读取GB大小的文本文件?,python,replace,Python,Replace,我写了一个python脚本来快速读取和替换文件夹中的多个Gb大小的文本文件。有没有比我的脚本更快的方法呢?当这个脚本运行时,是否可以为这个脚本指定几个cpu内核 import re import os drc = '/root/tmp' pattern = re.compile('"') oldstr = '"' newstr = '' for dirpath, dirname, filename in os.walk(drc):

我写了一个python脚本来快速读取和替换文件夹中的多个Gb大小的文本文件。有没有比我的脚本更快的方法呢?当这个脚本运行时,是否可以为这个脚本指定几个cpu内核

    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()

最简单的改进:停止使用
re
,如果re.search(pattern,strg):改为
如果strg中的oldstr:
re
在这里买不到任何东西(比简单的字符串搜索固定字符串要贵)

或者(更复杂的是),如果您知道文件的编码,则可以使用
mmap
模块(特别是使用
find
方法)从中获益为了避免将整个文件加载到内存中,并在字符串不大可能出现在输入中时对其进行解码,只需对搜索字符串进行预编码并搜索原始二进制数据。注意:这对某些编码不起作用,在某些编码中,读取未对齐的原始字节可能会得到误报,但对于自编码来说效果很好同步编码(如UTF-8)或单字节编码(如ASCII、拉丁语-1)

最后,在重写文件时,避免先将其写入内存,然后再重写原始文件;此外,还要避免程序死机(或运行缓慢)如果文件大小超过物理RAM,这意味着如果程序在开始重写文件后死亡,您将永远丢失数据。
tempfile
模块可用于在与原始文件相同的
dir
中创建一个临时文件,您可以逐行读取并在执行时替换,写入临时文件,直到恢复完成。然后只需执行从临时文件到原始文件名的原子重命名,以作为单个操作替换原始文件(确保它是新数据或旧数据,而不是数据的中间版本)


并行化可能会给您带来一些好处,但如果您是在旋转磁盘上操作,I/O争用很可能是有害的,而不是有益的。我唯一一次看到可靠的改进是在具有足够带宽的网络文件系统上,但有足够的延迟来保证并行运行I/O操作。

如果您在linux上。@sshashank124以前我使用了一个sed脚本,但它比这个python脚本慢。我知道python脚本比bash脚本快。@sshashank124#!/bin/bash cd”/root/tmp“sed-I-e's/”//g'*.TXT rm*。TXTe@Sushant我不知道在给定的链接中使用哪一个是正确的?它们是简单的文本文件(我认为是UTF-8),我不知道如何修改我的代码,使其在您提到的缺少RAM的情况下工作?@SandunDayananda:查看。这并不是特别困难,只是从一个打开的文件到一个
mmap.mmap
对象,然后以非复制的方式使用所述对象的一点样板文件(例如,不要切片它,它是复制的,但是
memoryview
s或
find
方法在不复制的情况下工作)。