如果我在一个文件中有100万行,我不能直接跳到第50000行而不逐行迭代(这是顺序访问)。这是我在谷歌做一些研究后的理解。
如果是这种情况,那么数据库中有1TB数据的情况如何在几秒钟内搜索一行。在一天结束时,DB还存储了一些带有自己元数据的格式化文件。
是否可以在100万行记录的文件中实现这种快速字符串搜索。什么样的实现有助于我们处理如此大规模的数据...
注意每行的长度可能在10到100之间变化。
是否可以在Java中使用?
答案 0 :(得分:8)
您需要维护行所在的索引。我有一个库来完成这个Java Chronicle。一旦对行进行索引(它在编写时就构建了它们),您可以在短至100 ns内随机访问它们。
它旨在处理同一文件中的TB数据或相对较少数量的文件。如果您有数千个文件,则需要使用不同的方法,因为每个文件的开销会变得很大。
答案 1 :(得分:2)
1-只读取所有行一次
2-将lineNumber(作为Key)和startingPostionOfLine放入Map对象。
然后,
你可以得到startingPostionOfLine = map.get(lineNumber)。
找到startingPosition后,用RandomAccessFile.seek(startingPosition)方法跳转。
答案 2 :(得分:2)
您可以调整文件结构以进行二进制搜索。使用唯一标记(行本身未使用的字节序列)开始每行,后跟行号。正在寻找一条线,
你对线条的假设越多,跳跃的随机性就越小。例如,您可以根据平均线长估算位置。您还可以拥有某些行位置的缓存以改善猜测。
答案 3 :(得分:1)
我不能直接跳到第50000行而不逐行迭代
答案 4 :(得分:1)
如果您知道每行的长度,那么您可以使用RandomAccessFile然后skipBytes到您想要的行。