【发布时间】:2011-10-28 02:42:00
【问题描述】:
我有一个大文件(1 亿行制表符分隔值 - 大小约为 1.5GB)。根据其中一个字段对其进行排序的最快已知方法是什么?
我已经尝试过蜂巢。我想看看这是否可以使用 python 更快地完成。
【问题讨论】:
我有一个大文件(1 亿行制表符分隔值 - 大小约为 1.5GB)。根据其中一个字段对其进行排序的最快已知方法是什么?
我已经尝试过蜂巢。我想看看这是否可以使用 python 更快地完成。
【问题讨论】:
您是否考虑过使用 *nix sort 程序?用原始术语来说,它可能会比大多数 Python 脚本更快。
使用-t $'\t' 指定它是制表符分隔的,-k n 指定字段,其中n 是字段编号,如果要将结果输出到新文件,则使用-o outputfile。
示例:
sort -t $'\t' -k 4 -o sorted.txt input.txt
将对input.txt的第4个字段进行排序,并将结果输出到sorted.txt
【讨论】:
你想为文件建立一个内存索引:
open文件f.readline(),并在列表中存储一个包含要排序的值(使用line.split('\t').strip()提取)和文件中行的偏移量(您可以在拨打f.readline()之前拨打f.tell()获取)close文件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)
【讨论】:
拆分成可以在内存中排序的文件。对内存中的每个文件进行排序。然后合并生成的文件。
通过读取每个要合并的文件的一部分进行合并。每个文件的数量相同,为合并结果留出足够的内存空间。一旦合并保存这个。重复将合并数据块添加到文件中。
这会最小化文件 i/o 并在磁盘上移动文件。
【讨论】:
我会将文件存储在一个良好的关系数据库中,在您感兴趣的字段上对其进行索引,然后读取订购的项目。
【讨论】: