需求:读取日志文件(大于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