0

我有一个 1.99 GB 的字符文件。现在,我想从该文件中随机提取数百万个子序列,例如从位置 90 到 190、10 到 110、50000 到 50100 等(每个 100 个字符长)。任何人都可以帮助我如何以一种好的方式做到这一点。

注意:我没有足够的内存将整个文件放入内存。

4

3 回答 3

2

将文件拆分为几个固定大小的文件(例如每个 16K)。

读取 char n 时,执行 n /filesize 获取文件。使用 n % filesize 获取文件中的起始字符。为了读取文件尾部,您可以添加额外的逻辑并读取下一个文件,或者只是在每个文件中添加以下 100 个字符(并在下一个文件中复制它们)。

当然,只有使用原始文件并seek每次打开/执行的选项。但我不确定它的性能,并且它可能因不同的操作系统而有很大差异。

选项 2:生成大量随机索引并对它们进行排序。然后只需扫描文件(RandomAccessFile 或 FileInputStream)并获取所有链。它将最小化 HD 时间,问题将是控制存储索引所需的内存/订购它们所需的时间。当一个角色属于两个或多个链时,情况也会增加复杂性。

于 2012-08-14T16:46:30.597 回答
0

您可以尝试RandomAccessFile - 它允许将文件搜索到随机位置并读取所需数量的字符。

于 2012-08-14T16:49:30.257 回答
0

按起始索引对所需的子序列进行排序。

现在开始穿过它们。使用 RandomAccessFile 从所需的下一个子序列的起点开始抓取一块磁盘。

块的大小取决于你的命中率(块的其余部分有多少可能有用) - 命中率越高,块应该越大(当然,在一定程度上)。您可能会考虑在子序列列表中向前看并相应地调整块大小。将所有可能的子序列拉出块。重复直到完成。

我不明白其他地方提到的大于 2GB 的文件有什么问题。

于 2012-08-14T17:24:28.703 回答