我正在尝试打开最新的日语维基百科数据库,以便在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的“报纸中最常用的汉字”的现代版本。 :)
答案 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()