我要求将记录写入文件,其中数据根据数字键的值写入文件位置(即搜索位置).例如,如果键为100,我可能会写入位置400.
记录由数字键和一段数据组成.记录不会很大(几个字节).但是,可能会有很多记录(数百万).
有两种可能的情况:
键是单调增加的.在这种情况下,最好的方法是使用DataOutputStream包装a 进行写入BufferedOutputStream,将缓冲区大小设置为某个数字(例如64k)以最大化I/O吞吐量.
密钥正在增加,但可能存在较大差距.在这种情况下,使用OutputStream将需要在文件的间隙中写入零.为了避免这种情况,RandomAccessFile它可以更好,因为它可以寻找空隙,如果可以寻找整个块,节省空间.缺点是,据我所知,RandomAccessFile不缓冲,因此这种方法对于顺序密钥来说会很慢.
但是,可能的情况是文件是两者兼而有之.有一系列单调增加的密钥.有一些键间隙很小,其他键间隙很大.
我正在寻找的是一个提供两全其美的解决方案.如果检测到键之间的间隙,则可能在两个I/O模式之间切换.但是,如果有一个标准的Java类可以完成这两件事,那就更好了.我见过FileImageOutputStream,但我不确定这是怎么回事.
请注意,我不是在寻找代码示例(虽然这对于演示复杂的解决方案很有帮助),但这只是一个通用策略.最好知道顺序数据的最佳大小缓冲区大小以及从顺序策略切换到随机访问策略需要的时间点(间隙大小).
编辑:
为了接受答案,我希望保证所提出的解决方案能够处理两者,而不仅仅是它可能.这需要:
此外,解决方案需要具有内存效率,因为可能会同时打开许多这些文件.
编辑2
这些文件可以在NAS上.这不是设计,而是简单地认识到在企业环境中,这种架构被大量使用,解决方案可能应该处理它(可能不是最佳的)而不是阻止它的使用.AFAIK,这不应该影响基于write()和的解决方案lseek(),但可能会使一些更深奥的解决方案失效.