性能 - Python与C#/ C++/C读取char-by-char

Ton*_*zzo 0 c# python performance character

所以我有这些巨大的XML文件(和巨人,我的意思是1.5GB +),他们没有CRLF.我正在尝试运行类似diff的程序来查找这些文件之间的差异.

由于我还没有找到一个不会因内存耗尽而爆炸的差异程序,我决定最好的办法是在关闭标签后添加CRLF.

我写了一个python脚本来读取char-by-char并在'>'之后添加新行.问题是我的单核PC大约1995年或荒谬的东西上运行这一点,它只是处理约20MB /小时的时候我已经都在同一时间转换.

任何想法,如果用C#/ C/C++写这个将产生任何好处?如果没有,有没有人知道将逐字节的diff程序?谢谢.


编辑:

这是我的处理功能的代码......

def read_and_format(inputfile, outputfile):
    ''' Open input and output files, then read char-by-char and add new lines after ">" '''
    infile = codecs.open(inputfile,"r","utf-8")
    outfile = codecs.open(outputfile,"w","utf-8")

    char = infile.read(1) 
    while(1):
        if char == "":
            break
        else:
            outfile.write(char)
            if(char == ">"):
                outfile.write("\n")
        char = infile.read(1)

    infile.close()
    outfile.close()
Run Code Online (Sandbox Code Playgroud)

EDIT2: 感谢您的回复.增加读取大小创造了令人难以置信的速度提升.问题解决了.

Mic*_*sen 11

一次读取和写入一个字符几乎总是很慢,因为磁盘是基于块的设备,而不是基于字符的设备 - 它将读取的内容远远超过您所追求的一个字节,并且剩余部分需要丢弃.

尝试一次读取和写入更多,比如8192字节(8KB),然后在写出之前在该字符串中查找和添加换行符 - 你应该节省很多性能,因为需要的I/O要少得多.

正如LBushkin所指出的那样,你的I/O库可能正在进行缓冲,但除非有某种形式的文档证明这确实发生了(对于阅读和写作),否则在用其他语言重写之前尝试是相当容易的.

  • 大多数语言和I/O库已经在后台执行缓冲以避免这些问题.它们在内部读取块(确切的大小取决于库,OS,有时还有配置),然后只从缓冲区中返回一个字节. (12认同)