我有一个2GB的文本文件,我想清理此文件,使其仅包含ASCII可打印和中文字符(约10000个字符)。
我在下面尝试了两个代码,但是它们都很慢。 感谢任何建议。
chi_char = open(chinese_file,'r',encoding='UTF-8').read()
include = set(string.printable+all_chi_char)
full_text = open(source_file,'r',encoding='UTF-8').read()
output_text = ''.join(ch for ch in full_text if ch in include)
chi_char = open(chinese_file,'r',encoding='UTF-8').read()
include = set(string.printable+all_chi_char)
full_text = open(source_file,'r',encoding='UTF-8').read()
output_text = ''
for ch in full_text:
if ch in include:
output_text += ch
答案 0 :(得分:1)
首先,您真的确定这是正确的做法吗?我们经常看到人们尝试通过随机想法启发式清理数据,而不是从源头解决问题。
>也许有一种方法可以删除您在此过程的早期不需要的东西,或者至少向我们解释为什么您的数据包含您不希望包含的东西?当前方法的问题是,没有充分的理由立即将整个文本文件加载到内存中。 Python可能无法一次在驻留内存中拥有全部2GB(加上其自己的代码和运行时状态所需的任何内容),因此OS会将内存区域换出到磁盘上,而只能反复地将它们换回来。
您最终是否需要将整个结果文本存储在内存中?如果不是这样,只需一次读写一行,然后将该内存重新用于下一行文本即可。
with open(chinese_file,'r',encoding='UTF-8') as all_chi_char:
include = set(string.printable+all_chi_char.read())
with open(source_file,'r',encoding='UTF-8') as inp, open(dest_file, 'w') as outp:
for line in inp:
out_line = []
for ch in line:
if ch in include:
out_line.append(ch)
outp.write(''.join(out_line))
仍然可以通过使用string.maketrans()
而不是本地生成的set
字符来改善此问题,但我想这已经可以解决性能问题。