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

在python中查找文件的中间位置,python,search,file-handling,Python,Search,File Handling,我正在编写一个程序来搜索非常大(无序)文件中的特定行(因此最好不要将整个文件加载到内存中) 我正在实现多线程以加快进程。我试图给一个特定的线程一个文件的特定部分,即,第一个线程将运行文件的第一个四分之一,第二个线程(同时)从第一个线程停止的端点开始扫描,依此类推 所以要做到这一点,我需要找到文件不同部分的字节位置,为了问题的简单性,假设我只想找到文件的中间部分。但问题是每一行都有不同的长度,所以如果我这样做的话 fo.seek(0, 2) end = fo.tell() mid = end/2

我正在编写一个程序来搜索非常大(无序)文件中的特定行(因此最好不要将整个文件加载到内存中)

我正在实现多线程以加快进程。我试图给一个特定的线程一个文件的特定部分,即,第一个线程将运行文件的第一个四分之一,第二个线程(同时)从第一个线程停止的端点开始扫描,依此类推

所以要做到这一点,我需要找到文件不同部分的字节位置,为了问题的简单性,假设我只想找到文件的中间部分。但问题是每一行都有不同的长度,所以如果我这样做的话

fo.seek(0, 2)
end = fo.tell()
mid = end/2
fo.seek(mid, 0)
它可以给我中间的线。所以我需要一种方法来寻找下一条或上一条新线。另外,请注意,我不希望确切的中间只是在它周围的某个地方(因为它是一个非常大的文件)

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

任何更快的修改(或新程序)将不胜感激

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()
多大是非常大的<代码>grep即使在1-10GB的文件中也能相对快速地撕破

如果文件是静态的,并且您计划重复搜索它,您可以
拆分它:

split -l <line_count> <file>
split-l
现在您有了多个文件,并且可以将每个文件传递给单独的线程/进程/任何东西

文件分类了吗?这再次改变了情况,因为现在您可以使用
fo.seek()
调用进行二进制搜索

多快才算足够快?超过某一点,您将不得不建立一个搜索索引。到目前为止,像
grep
split
等简单工具都能创造奇迹


如果没有更多的信息,就不可能说出正确的折衷方法。

与往常一样,IO操作很少从多线程中获得速度提升。我不能通过你的代码来欺骗你,但我猜在
fo.seek(file_['mid'])之后;fo.readline()
你在换行,也就是说,
fo.tell()
你在找什么?@alko我认为在python中,多线程的唯一目的是帮助IO操作,而多处理是帮助cpu操作……我不认为从多个线程读取文件可能更快。在询问者将其与一个简单的“for line in open('myfile')”进行比较后,这可能会很有趣:“读取如果受读取速度的限制,
2个线程从两个不同方向搜索一行,那么每个线程的运行速度都是
单个线程线性搜索速度的一半。如果您的检查很昂贵(例如,您正在查询外部服务),则在一个线程中线性读取文件并使用一组工作线程并行执行检查会更简单、更容易。文件大小可以在2-8 GB之间。不,文件未排序。拆分似乎是一个不错的选择。