我目前正在从事一个旨在提高I / O效率的项目。实际上,它执行I / O繁重的操作,因此需要高效。
我执行数据压缩,当然不可能确定压缩后的大小(仅按原始大小),因为它取决于实际数据的熵。
因为串行化机制是并行的,所以我不能只写数据,而是需要在串行化之前知道每个压缩数据块的确切大小。因此,我之前计算了这个大小(称为偏移量)。我实际上压缩数据并缓存结果,直到发生实际的序列化为止。
现在,因为压缩算法需要一个缓冲区才能将数据写入数据,而且动态增长的结构也不可行,所以我分配了一个ByteBuffer,其最大大小可以在压缩后产生(这是可确定的,并且大于原始数据)。现在,在此之后,我想缓存缓冲区,但是缓冲区有开销,因为这种最坏的情况很少发生,并且我具有良好的压缩率,因此压缩后的实际数据大小小于缓冲区本身。我想消除这种情况。
该想法是仅分配虚拟地址空间,并且仅在实际写入数据时将其映射。因此,我可以分配最大大小,但是实际内存使用情况取决于压缩后写入缓冲区的实际大小。
为此,我认为我可以使用 MappedByteBuffer 并通过 MapMode = PRIVATE 映射到“伪”文件,这样,更改就不会被实际写入,而是被复制并存储在其中记忆。我不知道这是否会满足我的要求(仅分配实际需要的空间),并且由于难以测试,因此我会问一个有经验或曾经实际使用过的人。
FileChannel fakeFile = FileChannel.open(File.createTempFile("dummy", "map").toPath(), StandardOpenOption.WRITE, StandardOpenOption.READ);
MappedByteBuffer mappedBuf = fakeFile.map(FileChannel.MapMode.PRIVATE, 0, maximumSize);
// MappedBuf is saved now
此代码确实有效,但是我不知道它是否在内部正常工作,例如通过不分配整个maximumSize内存来进行“优化”。