排序大型文本数据

时间:2011-08-16 14:08:24

标签: python sorting bigdata

我有一个大文件(1亿行标签分隔值 - 大小约为1.5GB)。基于其中一个字段对此进行排序的最快的已知方法是什么?

我试过蜂巢。我想看看是否可以使用python更快地完成。

4 个答案:

答案 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)

您想为文件构建内存索引:

  1. 创建一个空列表
  2. open文件
  3. 逐行读取(使用f.readline(),并在列表中存储一个元组,该元组由您要排序的值(使用line.split('\t').strip()提取)和该行中的行的偏移​​量组成。文件(您可以在致电f.tell()之前致电f.readline()获取)
  4. close文件
  5. sort列表
  6. 然后打印已排序的文件,重新打开文件,对于列表的每个元素,使用f.seek(offset)将文件指针移动到行的开头f.readline()以读取行和{ {1}}这条线。

    优化:您可能希望在列表中存储行的长度,以便在打印阶段使用print

    示例代码(针对可读性而非速度进行了优化):

    f.read(length)

答案 2 :(得分:3)

分割成可在内存中排序的文件。对内存中的每个文件排序。然后合并生成的文件。

通过读取要合并的每个文件的一部分进行合并。来自每个文件的相同数量在内存中留下足够的空间用于合并结果。合并后保存这个。重复将合并数据块添加到文件中。

这样可以最大限度地减少文件i / o并在磁盘上移动文件。

答案 3 :(得分:2)

我会将文件存储在一个良好的关系数据库中,在您感兴趣的字段上对其进行索引,然后阅读订购的项目。