文件打开/读取的速度取决于语言



我有一个非常大的文件集合,我的任务是从这个集合中打开几个随机文件,将它们的内容视为一组整数并进行交集。

由于从磁盘读取文件到内存的时间很长,这个过程相当慢,所以我想知道用一些"快速"语言重写程序是否可以加快从文件读取的过程。目前我正在使用python,这可能对这种工作效率很低。(如果我知道python和javascript之外的其他语言,我可以自己实现测试…)

将所有日期放入数据库也会有帮助吗?文件无论如何都不适合RAM,所以它将再次从磁盘读取,只需要与数据库相关的开销。

文件的内容是长整数的列表。90%的文件都很小,小于10-20MB,但剩下的10%大约在100-200mb之间。作为输入,a有文件名,我需要读取每个文件,并输出每个给定文件中的整数。我曾尝试将这些数据放在mongodb中,但这与基于普通文件的方法一样慢,因为我尝试使用mongo索引功能,而mongo不将索引存储在RAM中。现在,我只需剪切10%的最大文件,并将其余文件存储在redis中,有时还会访问那些大文件。这显然是一个临时解决方案,因为我的数据会增长,而可用RAM的数量却不会。

您可以尝试的一件事是逐块计算文件的交集(即,从每个文件中读取x个字节到内存中,计算它们的交集,然后继续,最终计算所有交集的交集)。

或者,您可以考虑使用一些"重载"库来帮助您。考虑查看PyTables(使用HDF存储)/使用numpy计算交集。好处是HDF层应该有助于处理不同时将整个阵列结构保存在内存中的问题——尽管我以前没有尝试过这些工具,但它们似乎提供了您所需要的。

如果没有文件包含重复的数字,我会尝试这个:

sort file1 file2 | uniq -d

如果它们可能包含重复项,那么您需要首先消除重复项:

sort -u file1 > /tmp/file1
sort -u file2 > /tmp/file2
cat /tmp/file1 /tmp/file2 | sort | uniq -d

或者,如果您喜欢不(显式)使用临时文件的版本。

(sort -u file1; sort -u file2) | sort | uniq -d

您没有说明文件的格式(以上假设为文本,每行一个整数)。如果它们是二进制格式的,那么在应用上述命令之前,还需要一个命令来翻译它们。通过使用管道,你可以像这样组成这个步骤:

(decode file1 | sort -u ; decode file2 | sort -u) | sort | uniq -d

这里decode是您必须编写的程序的名称,该程序解析您的文件格式。

除了非常短和简单之外,这个shell解决方案的好处是它可以处理任何大小的文件,即使它们不适合RAM。

从你的问题中还不清楚你是否有2个或任意数量的文件要相交(问题的开头写着"一对",结尾写着"文件名列表")。例如,要处理5个文件而不是2个文件,请使用uniq -c | awk '{ if ($1=="5") print $2; }'而不是uniq -d

最新更新