在python中寻找文件的中间位置

时间:2013-12-06 14:13:21

标签: python search file-handling

我正在编写程序来搜索非常大(无序)文件中的特定行(因此首选不会加载整个归档到内存中)。

我实施多线程以加快流程。我试图给特定线程一个文件的特定部分,即第一个线程将运行文件的第一个四分之一,第二个线程从第一个线程停止的位置扫描(同时),所以上。

所以要做到这一点,我需要找到文件不同部分的字节位置,以简化问题,让我说我只想找到文件的中间部分。但问题是每一行都有不同的长度,所以如果我只是做

fo.seek(0, 2)
end = fo.tell()
mid = end/2
fo.seek(mid, 0)

它可以给我中间线。所以我需要一种方法来寻找下一个或上一个换行符。另外,请注意我不希望完全中间位于它周围(因为它是一个非常大的文件)。

这是我能够编码的内容,我不确定这是否会将文件加载到内存中。我真的想避免打开同一个文件的2个实例(我在我的程序中这样做,因为我不想担心读取文件时偏移量的变化)。

任何更快的修改(或新程序)都将受到赞赏。

fo = open(filename, "rw+")
f2 = open(filename, "rw+")

file_ = dict()

fo.seek(0, 2)
file_['end'] = fo.tell()

file_['mid'] = file_['end'] / 2

fo.seek(file_['mid'], 0)
f2.seek(file_['mid'], 0)

line =  f2.readline()

fo.seek(f2.tell(), 0)
file_['mid'] = f2.tell()


fo.seek(file_['mid'], 0)

print fo.readline()

1 个答案:

答案 0 :(得分:3)

非常大有多大? grep甚至可以通过1-10GB的文件快速撕掉。

如果该文件是静态的,并且您打算重复搜索该文件,则可以split

split -l <line_count> <file>

现在您有多个文件,并且可以将每个文件传递给单独的线程/进程/无论如何。

文件是否排序?这会改变一些事情,因为现在你可以只用fo.seek()次调用进行二元搜索。

速度有多快?超越某一点,您将不得不构建一个搜索索引。到目前为止,grepsplit等简单工具可以创造奇迹。

如果没有更多信息,就不可能说出正确的权衡取舍。