Java-从字符文件中提取子序列

Java-从字符文件中提取子序列,java,Java,我有一个1.99 GB的字符文件。现在,我想从该文件中随机提取数百万个子序列,例如从位置90到190、10到110、50000到50100等等(每个都有100个字符长)。有人能帮我吗?我怎样才能做得好呢 注意:我没有足够的内存将整个文件放入内存。将文件拆分为几个固定大小的文件(例如每个16K) 读取char n时,请执行n/filesize以获取文件。使用n%filesize获取文件中的起始字符。对于读取文件尾部,您可以添加额外的逻辑并读取下一个文件,或者只向每个文件添加以下100个字符(并在下

我有一个1.99 GB的字符文件。现在,我想从该文件中随机提取数百万个子序列,例如从位置90到190、10到110、50000到50100等等(每个都有100个字符长)。有人能帮我吗?我怎样才能做得好呢


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

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

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

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


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

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

通过启动索引对所需的子序列进行排序

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

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


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

我认为是这样的,但这可能会非常昂贵。它支持1.99 GB的文件吗?@arpsss它比2GB小一点-是的。如果您的文件大于2Gb—可能会有问题(请参见此处),我怀疑RandomAccessFile是如何在FS之上实现的。例如,在FAT上,它仍然会读取所有的块以获得所需的块;它将易于使用,但不会提供良好的性能。子序列是否正常?它们重叠吗?您能在内存中保存所有子序列范围(不是内容,只是开始/结束点)吗?非常粗略地说,文件在子序列中的百分比是多少?@EdStaub,“子序列是否有序?”-不,随机。“它们重叠吗?”可能是。“你能在内存中保存所有子序列范围(不是内容,只是开始/结束点)吗?”-我有那么多内存,但因为我很快就需要子序列,我等不及了。对不起,没有跟随-等什么?@EdStaub,等一下收集所有开始/结束点。