对大文本数据进行排序
我有一个大文件(1 亿行制表符分隔值 - 大小约为 1.5GB)。根据某个字段对其进行排序的最快的已知方法是什么?
我已经尝试过蜂巢。我想看看是否可以使用 python 更快地完成此操作。
I have a large file (100 million lines of tab separated values - about 1.5GB in size). What is the fastest known way to sort this based on one of the fields?
I have tried hive. I would like to see if this can be done faster using python.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您是否考虑过使用 *nix
sort
程序?从原始角度来看,它可能比大多数 Python 脚本更快。使用
-t $'\t'
指定以制表符分隔,-k n
指定字段,其中n
是字段编号,如果要将结果输出到新文件,请使用-o outputfile
。示例:
将对
input.txt
的第 4 个字段进行排序,并将结果输出到sorted.txt
Have you considered using the *nix
sort
program? in raw terms, it'll probably be faster than most Python scripts.Use
-t $'\t'
to specify that it's tab-separated,-k n
to specify the field, wheren
is the field number, and-o outputfile
if you want to output the result to a new file.Example:
Will sort
input.txt
on its 4th field, and output the result tosorted.txt
你想为文件建立一个内存索引:
open
文件f.readline()
),并存储在列表是一个元组,其中包含要排序的值(使用line.split('\t').strip()
提取)和文件中该行的偏移量(您可以使用该值来排序)。可以通过电话获取f.tell()
在调用f.readline()
之前)关闭
文件排序
列表然后打印排序后的文件,重新打开该文件,对于列表中的每个元素,使用 f.seek(offset) 将文件指针移动到行的开头,
f.readline()< /code> 读取该行并
打印
优化:您可能希望将行的长度存储在列表中,以便可以在打印阶段使用
f.read(length)
示例代码(针对可读性而非速度进行了优化):
you want to build an in-memory index for the file:
open
the filef.readline()
, and store in the list a tuple consisting of the value on which you want to sort (extracted withline.split('\t').strip()
) and the offset of the line in the file (which you can get by callingf.tell()
before callingf.readline()
)close
the filesort
the listThen to print the sorted file, reopen the file and for each element of your list, use
f.seek(offset)
to move the file pointer to the beginning of the line,f.readline()
to read the line andprint
the line.Optimization: you may want to store the length of the line in the list, so that you can use
f.read(length)
in the printing phase.Sample code (optimized for readability, not speed):
分成可以在内存中排序的文件。对内存中的每个文件进行排序。然后合并生成的文件。
通过读取要合并的每个文件的一部分来进行合并。每个文件的数量相同,为合并结果在内存中留下足够的空间。一旦合并保存这个。重复将合并数据块添加到文件中。
这可以最大限度地减少文件 I/O 以及在磁盘上移动文件。
Split up into files that can be sorted in memory. Sort each file in memory. Then merge the resulting files.
Merge by reading a portion of each of the files to be merged. The same amount from each file leaving enough space in memory for the merged result. Once merged saving this. Repeating adding blocks of merged data onto the file.
This minimises the file i/o and moving around the file on the disk.
我会将文件存储在一个良好的关系数据库中,在您感兴趣的字段上索引它,然后读取订购的项目。
I would store the file in a good relational database, index it on the field your are interested in and then read the ordered items.