3

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

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

有可能在100万行记录的文件中实现如此快速的字符串搜索吗?什么样的实现可以帮助我们处理如此大规模的数据......

注意 每行的长度可能从 10 到 100 不等。

在Java中可能吗?

4

5 回答 5

8

您需要维护行所在位置的索引。我有一个执行此Java Chronicle的库。一旦这些行被索引(它在你编写它们时构建),你可以在短短 100 ns 内随机访问它们。

它旨在处理同一文件中的 TB 数据,或相对少量的文件。如果您有数千个文件,则需要使用不同的方法,因为每个文件的开销会变得很大。

于 2012-10-21T10:18:00.657 回答
2

1- 只读取一次所有行
2- 将 lineNumber(as Key) 和 startingPostionOfLine 放入 Map 对象。

然后,

你可以得到startingPostionOfLine=map.get(lineNumber)。
找到startingPosition后,用RandomAccessFile.seek(startingPosition)方法跳转。

于 2012-10-21T10:29:09.773 回答
2

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

  1. 跳到随机位置;
  2. 向前阅读直到标记;
  3. 读取行号;
  4. 如果它是您正在寻找的那个,那么您就完成了;否则选择另一个随机位置跳转(大于或小于当前位置,取决于您找到的行号)。

你对你的线条的假设越多,跳跃的随机性就越小。例如,您可以根据平均线长估计位置。您还可以缓存一些行位置以改进猜测。

于 2012-10-21T11:11:12.807 回答
1

如果不逐行迭代,我无法直接跳转到第 50000 行

看看随机访问文件

于 2012-10-21T10:17:31.657 回答
1

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

于 2012-10-21T10:18:05.467 回答