我正在编写程序来搜索非常大(无序)文件中的特定行(因此首选不会加载整个归档到内存中)。
我实施多线程以加快流程。我试图给特定线程一个文件的特定部分,即第一个线程将运行文件的第一个四分之一,第二个线程从第一个线程停止的位置扫描(同时),所以上。
所以要做到这一点,我需要找到文件不同部分的字节位置,以简化问题,让我说我只想找到文件的中间部分。但问题是每一行都有不同的长度,所以如果我只是做
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()
答案 0 :(得分:3)
非常大有多大? grep
甚至可以通过1-10GB的文件快速撕掉。
如果该文件是静态的,并且您打算重复搜索该文件,则可以split
:
split -l <line_count> <file>
现在您有多个文件,并且可以将每个文件传递给单独的线程/进程/无论如何。
文件是否排序?这会改变一些事情,因为现在你可以只用fo.seek()
次调用进行二元搜索。
速度有多快?超越某一点,您将不得不构建一个搜索索引。到目前为止,grep
,split
等简单工具可以创造奇迹。
如果没有更多信息,就不可能说出正确的权衡取舍。