添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

需求:读取日志文件(大于2GB),文件内容超过2千万行,实现从指定行数开始往后读取若干行内容,如:从1500万行往后读500行,或从1900万行往后读600行等。

如何快速的定位指定的行数,如何高效的实现文件内容读取,各位达人请指点,谢过先。

----------------------------------------------

另:已使用BufferedReader试过,没法快速定位行数,越往后时间消耗越多,最糟糕的达到30s,这个结果没法接受。

分割方法:http://kerry.blog.51cto.com/172631/292485

######

引用来自“scylla”的评论

先用按行把文件分割了,文件进行编号再读取定位行数 日志文件在生成的时候就应该分割######补充一下java下有支持随机读的 RandomAccessFile.seek######回复 @MZHS : 恩,我说的这种情况,也可能与它的这种情况不太一样。 文件过大确实需要分割的,还有我说的那种本身单个文件大小在30M左右,顺序读。 他这个需求如果只是读取定位的话,是可以按照自定义标识符的就像你说的这样。可以写一个LINE_END_CHAR######回复 @MZHS : 的确定位的问题暂时没有好的办法######回复 @宇智波带土 : 那读取某行内容的时候,你还得读索引文件,你的索引文件只提供了行号和数据,并不能起到快速定位的作用,如果想快速定位,就要分而治之,要知道什么位置的行号是多少,要达到这种效果就要把大文件分小,给了行号就知道去第几个文件的第几行或者放置在内存中 个人愚见######回复 @MZHS : 可以定义一个索引文件,记录当前读取的行数,还有写入等数据。######难就难在你怎么知道多少字节后是一行的开始######建议,多线程读取,根据文件大小将文件分割成若干块,块末尾读取看是不是分行符号,如果是分行符号,则确定该块长度。再用 RandomAccessFile.seek去读取 @ 宇智波带土 @ yangrfa

只提供解决方案,可行与否,慎重斟酌

######回复 @MZHS : 谢谢提供思路######如果发现不是分行符号,则读取下一个字节,注意块开始和块结尾字节位置的变化######用apache下的common IO包重的LineIterator a=FileUtils.lineIterator(new File("")); 读取试试######

https://github.com/ikcourage/LFS 建议用 LFS 来记录日志,或者针对目前这个案例,将日志同步到 LFS 会更简单。

######谢谢,看看先 2020-06-06 23:54:37 企业邮箱发送邮件时,若出现投递失败产生退信,内容提示包含如下: the mta server of * reply:550 failed to meet SPF requirements 或者 the mta server of 163.com — 163mx01.mxmail.netease.com(220.181.14.141) reply:550 MI:SPF mx14,QMCowECpA0qTiftVaeB3Cg—.872S2 1442548128 http://mail.163.com/help 299554