读取6.9GB文件会导致分段错误

时间:2013-05-18 00:45:20

标签: python

我正在尝试打开最新的日语维基百科数据库,以便在Linux上阅读Python 3.3.1,但是这个短程序出现Segmentation fault (core dumped)错误:

with open("jawiki-latest-pages-articles.xml") as f:
    text = f.read()

文件本身非常大:

-rw-r--r-- 1 fredrick users 7368183805 May 17 20:19 jawiki-latest-pages-articles.xml

所以看起来我可以存储的字符串有多长的上限。解决这种情况的最佳方法是什么?

我的最终目标是计算文件中最常见的字符,有点像Jack Halpern的“报纸中最常用的汉字”的现代版本。 :)

2 个答案:

答案 0 :(得分:11)

不要立刻阅读整篇文章。即使您的Python发行版编译为64位程序(在32位程序中根本不可能分配超过4 GB的虚拟内存),即使您有足够的RAM来存储它,它仍然是一个坏的我想立刻将它全部读入内存。

一个简单的选择是一次读一行并处理每一行:

with open("jawiki-latest-pages-articles.xml") as f:
    for line in f:
        # Process one line

或者,您可以使用固定大小的块处理它:

while True:
    data = f.read(65536)  # Or any other reasonable-sized chunk
    if not data:
        break
    # Process one chunk of data.  Make sure to handle data which overlaps
    # between chunks properly, and make sure to handle EOF properly

答案 1 :(得分:0)

这是我最终使用的程序,如果有人好奇的话。

from collections import Counter

counter = Counter()

progress = 0
with open("jawiki-latest-pages-articles.xml") as f:
    for line in f:
        progress += 1
        counter.update(line)
        if not progress%10000: print("Processing line {0}..., number {1}".format(line[:10], progress))

output = open("output.txt", "w+")

for k, v in counter.items():
    print("{0}\t{1}".format(k, v), file=output)

output.close()