Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 文件打开/读取速度是否取决于语言?_Python_File_File Io_Io_Filesystems - Fatal编程技术网

Python 文件打开/读取速度是否取决于语言?

Python 文件打开/读取速度是否取决于语言?,python,file,file-io,io,filesystems,Python,File,File Io,Io,Filesystems,我有一个很大的文件集合,我的任务是从这个集合中打开两个随机文件,将它们的内容作为一组整数处理,并将它们相交 由于将文件从磁盘读入内存需要很长时间,所以这个过程相当慢,所以我想知道,用一些“快速”语言重写我的程序是否可以加快从文件读入的过程。目前我正在使用python,这对于此类工作可能效率低下。(如果我知道python和javascript之外的其他语言,我可以自己实现测试…) 将所有数据输入数据库也会有帮助吗?无论如何,文件都不适合RAM,因此它只能以与数据库相关的开销再次从磁盘读取文件 文件

我有一个很大的文件集合,我的任务是从这个集合中打开两个随机文件,将它们的内容作为一组整数处理,并将它们相交

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

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

文件的内容是长整数列表。90%的文件非常小,小于10-20MB,但剩下的10%大约为100-200mb。作为输入,我有文件名,我需要读取每个文件并输出给定文件中的整数。 我曾尝试将这些数据放在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

执行任何操作的速度是否取决于语言?您需要访问这些文件中的所有数据,还是只选择文件中的部分?如果是后者,使用
mmap
可能会更快。另外,
numpy
可能有一些东西可以使数字的内存存储(以及计算它们的交点)更加高效。对于磁盘存储,可以考虑使用<代码> HDF5?你能更详细地描述你所尝试的,并提供这些文件的本质的更多细节吗?@ MattBoI,尽管所有的“现代”语言都有先进的编译器/翻译者,可以有效地处理简单的案例,所以重写的次数将接近任何一个。因此,您可以访问阵列,而无需将阵列一次完全加载到内存中。你试过了吗?@Moonwalker:二进制数据应该更快,因为读取的字节要少得多,而且将数字字符串转换为内部二进制格式所花费的时间也将被消除。坦率地说,我不希望pickle比纯文本好得多,因为它基本上仍然是基于文本的格式。请参考
sort
如何处理大型文件。你能画出一段一段的代码吗?我没有立即看到它如何处理在两个文件的不同块中出现的相同整数。还有,你的意思是“所有交点的并集”而不是“所有交点的交点”吗?