文件打开/阅读语言的速度是否依赖?

时间:2012-08-04 01:52:26

标签: python file file-io io filesystems

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

由于长时间从磁盘读取文件进入内存,这个过程非常慢,所以我想知道通过用一些“快速”语言重写我的程序是否可以加快从文件读取的过程。目前我正在使用python,这可能对这种工作效率低下。 (如果我在python和javascript旁边知道其他一些语言,我可以自己实现测试......)

还会将所有日期都放入数据库帮助吗?无论如何文件都不适合RAM,因此只有数据库相关的开销才能再次从磁盘读取。

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

2 个答案:

答案 0 :(得分:3)

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

或者,您可以考虑使用一些“重型”库来帮助您。考虑查看PyTables(使用HDF存储)/使用numpy计算交叉点。好处是,HDF层应该有助于处理不能将整个阵列结构同时保存在内存中 - 虽然我之前没有尝试过这些工具,但似乎它们提供了你需要的东西。

答案 1 :(得分:1)

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

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