ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

在Python中寻找文件的中间

2019-11-22 11:05:44  阅读:257  来源: 互联网

标签:file-handling search python


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

我正在实现多线程以加快该过程.我正在尝试为特定线程提供文件的特定部分,即第一个线程将运行到文件的第一季度,第二个线程从第一个线程停止的端点扫描(同时),以此类推.

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

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-10GB的文件,grep也会相对快速地流泪.

如果文件是静态文件,并且您打算重复搜索它,则可以拆分它:

split -l <line_count> <file>

现在您有了多个文件,并且可以将每个文件传递到单独的线程/进程/任何文件.

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

多快才足够快?超过某个点,您将必须建立搜索索引.到那时,简单的工具(例如grep,split等)就产生了奇迹.

没有更多信息,就无法说出正确的权衡.

标签:file-handling,search,python
来源: https://codeday.me/bug/20191122/2059470.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有