排序大型文本数据

fod*_*don 9 python sorting bigdata

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

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

urs*_*rei 17

你考虑过使用*nix sort程序吗?用原始术语来说,它可能比大多数Python脚本更快.

使用-t $'\t'指定它的制表符分隔,-k n指定域,其中n为外地号码,-o outputfile如果你想将结果输出到一个新文件.例:

sort -t $'\t' -k 4 -o sorted.txt input.txt
Run Code Online (Sandbox Code Playgroud)

input.txt对其第4个字段进行排序,并将结果输出到sorted.txt


gur*_*lex 6

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

  1. 创建一个空列表
  2. open 文件
  3. 逐行读取(使用f.readline(),并在列表中存储一个元组,该元组由您要排序的值(提取line.split('\t').strip())和文件中行的偏移量(您可以在调用f.tell()之前通过调用获得f.readline())
  4. close 文件
  5. sort 列表

然后打印已排序的文件,重新打开文件,对于列表的每个元素,使用f.seek(offset)将文件指针移动到行的开头,f.readline()以读取行和print行.

优化:您可能希望在列表中存储行的长度,以便您可以f.read(length)在打印阶段使用.

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

def build_index(filename, sort_col):
    index = []
    f = open(filename)
    while True:
        offset = f.tell()
        line = f.readline()
        if not line:
            break
        length = len(line)
        col = line.split('\t')[sort_col].strip()
        index.append((col, offset, length))
    f.close()
    index.sort()
    return index

def print_sorted(filename, col_sort):
    index = build_index(filename, col_sort)
    f = open(filename)
    for col, offset, length in index:
        f.seek(offset)
        print f.read(length).rstrip('\n')

if __name__ == '__main__':
    filename = 'somefile.txt'
    sort_col = 2
    print_sorted(filename, sort_col)
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是一个非常糟糕的主意。这样您就可以创建一个可以占用 8GB 或更多 RAM 的列表。(Python 空字符串为 40 个字节,将其乘以 2,因为您要在此元组中存储 2 个值,并乘以 1 亿 - 作者在问题中指定的行数)。问题的关键在于数据很大...... (2认同)