我有一个大文件(1亿行标签分隔值 - 大小约为1.5GB)。基于其中一个字段对此进行排序的最快的已知方法是什么?
我试过蜂巢。我想看看是否可以使用python更快地完成。
答案 0 :(得分:17)
您是否考虑过使用* nix sort
计划?用原始术语来说,它可能比大多数Python脚本更快。
使用-t $'\t'
指定它以制表符分隔,-k n
指定字段,n
是字段编号,-o outputfile
如果要输出结果到一个新文件。
例如:
sort -t $'\t' -k 4 -o sorted.txt input.txt
将在其第4个字段中对input.txt
进行排序,并将结果输出到sorted.txt
答案 1 :(得分:6)
您想为文件构建内存索引:
open
文件f.readline()
,并在列表中存储一个元组,该元组由您要排序的值(使用line.split('\t').strip()
提取)和该行中的行的偏移量组成。文件(您可以在致电f.tell()
之前致电f.readline()
获取)close
文件sort
列表然后打印已排序的文件,重新打开文件,对于列表的每个元素,使用f.seek(offset)
将文件指针移动到行的开头f.readline()
以读取行和{ {1}}这条线。
优化:您可能希望在列表中存储行的长度,以便在打印阶段使用print
。
示例代码(针对可读性而非速度进行了优化):
f.read(length)
答案 2 :(得分:3)
分割成可在内存中排序的文件。对内存中的每个文件排序。然后合并生成的文件。
通过读取要合并的每个文件的一部分进行合并。来自每个文件的相同数量在内存中留下足够的空间用于合并结果。合并后保存这个。重复将合并数据块添加到文件中。
这样可以最大限度地减少文件i / o并在磁盘上移动文件。
答案 3 :(得分:2)
我会将文件存储在一个良好的关系数据库中,在您感兴趣的字段上对其进行索引,然后阅读订购的项目。