逐行比较和连接文本文件时的性能问题



我附上我的谷歌协作脚本。它做了它应该做的事情,但它工作得很慢,太慢了。太慢了,协作团队无法在合理的时间内处理文件。代码应该只对两个文件进行简单的比较,并在此基础上连接其他文件。它还消耗大量的RAM。你能帮我优化一下吗?

下面是我的代码:
#@title Download and extract files.
!wget "https://object.pouta.csc.fi/OPUS-CCAligned/v1/moses/en-uk.txt.zip"
!wget "https://object.pouta.csc.fi/OPUS-CCAligned/v1/moses/en-pl.txt.zip"
!7z e "en-pl.txt.zip" -o"enpl"
!7z e "en-uk.txt.zip" -o"enuk"
#@title Do the task.
from tqdm import tqdm
def readlines_from_path(path, encoding="utf-8"):
with open(path, "r", encoding=encoding) as reader:
return reader.readlines()

english_polish_pl = readlines_from_path("enpl/CCAligned.en-pl.pl")
english_polish_en = readlines_from_path("enpl/CCAligned.en-pl.en")
english_ukranian_uk = readlines_from_path("enuk/CCAligned.en-uk.uk")
english_ukranian_en = readlines_from_path("enuk/CCAligned.en-uk.en")

for english, polish in tqdm(zip(english_polish_en, english_polish_pl), total=len(english_polish_en)):

if english not in english_ukranian_en:
continue
index = english_ukranian_en.index(english)

with open("pl-uk.pl", "a", encoding="utf-8") as writer:
writer.write(polish)
with open("pl-uk.uk", "a", encoding="utf-8") as writer:
writer.write(english_ukranian_uk[index])

问题是它的工作速度很慢,因为这些文件显示超过800h

这段代码中有几个问题。最大的一个是算法的复杂度是二次的(即。O(n²))。由于输入文件包含数百万行,这意味着要进行数千亿次字符串比较。它占用大量内存的事实肯定是由于每个输入文件的大小接近1 GiB,而CPython并不是专门为这种用例设计的。

可以通过将english_ukranian_uk转换为字典来解决性能问题从而知道O(1)中键的索引。这意味着更大的内存占用,但脚本的速度要快很多个数量级。

另一个问题是pl-uk.plpl-uk.uk连续重新打开,而它们只能打开一次。打开和关闭一个文件有点昂贵,因为它需要多个系统调用。这样做几百万次是不合理的。

相关内容

  • 没有找到相关文章

最新更新