我有一个1.99 GB的字符文件。现在,我想从该文件中随机提取数百万个子序列,例如从位置90到190,10到110,50000到50100等(每个长度为100个字符)。任何人都可以帮助我,我怎么能以一种很好的方式做到这一点。
注意:我没有足够的内存将整个文件存入内存。
答案 0 :(得分:2)
将文件拆分为几个固定大小的文件(比如每个16K)。
读取字符时,请执行n / filesize以获取文件。使用n%filesize来获取文件中的起始字符。要读取文件尾部,您可以添加额外的逻辑并读取下一个文件,或者只是向每个文件添加以下100个字符(并在下一个文件中复制它们)。
当然只有使用原始文件的选项,每次打开/执行seek
。但我不确定它的性能,并且它可能因不同的OS而变化很大。
选项2:生成大量随机索引并对其进行排序。然后只需执行一次扫描(RandomAccessFile或FileInputStream)并获取所有链。它将最小化HD时间,问题将是控制存储索引所需的内存/订购它们所需的时间。当角色属于两个或更多个链时,情况也会增加复杂性。
答案 1 :(得分:0)
您可以尝试RandomAccessFile - 它允许将文件搜索到随机位置并读取所需数量的字符。
答案 2 :(得分:0)
通过开始索引对所需的子序列进行排序。
现在开始走过它们。使用RandomAccessFile从所需的下一个子序列的起始点开始抓取磁盘块。
块的大小取决于你的命中率(块的其余部分可能有用多少) - 命中率越高,块应该越大(当然是一个点) 。您可以考虑在子序列列表中向前看,并相应地调整块大小。从块中拉出所有子序列。重复直到完成。
我不明白文件的问题>其他地方有2GB。