处理具有良好性能的非常大的文件

时间:2012-10-21 10:15:10

标签: java database file-io large-files

如果我在一个文件中有100万行,我不能直接跳到第50000行而不逐行迭代(这是顺序访问)。这是我在谷歌做一些研究后的理解。

如果是这种情况,那么数据库中有1TB数据的情况如何在几秒钟内搜索一行。在一天结束时,DB还存储了一些带有自己元数据的格式化文件。

是否可以在100万行记录的文件中实现这种快速字符串搜索。什么样的实现有助于我们处理如此大规模的数据...

注意每行的长度可能在10到100之间变化。

是否可以在Java中使用?

5 个答案:

答案 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)

您可以调整文件结构以进行二进制搜索。使用唯一标记(行本身未使用的字节序列)开始每行,后跟行号。正在寻找一条线,

  1. 跳到随机位置;
  2. 向前读,直到标记;
  3. 读取行号;
  4. 如果它是你正在寻找的那个,你已经完成了;否则选择另一个随机位置跳转到(根据你找到的行号,大于或低于当前位置)。
  5. 你对线条的假设越多,跳跃的随机性就越小。例如,您可以根据平均线长估算位置。您还可以拥有某些行位置的缓存以改善猜测。

答案 3 :(得分:1)

  

我不能直接跳到第50000行而不逐行迭代

查看random access file

答案 4 :(得分:1)

如果您知道每行的长度,那么您可以使用RandomAccessFile然后skipBytes到您想要的行。