Java 对1TB文件的读/写缓存-缓冲区上的代理/视图
我希望有一个对象(在纯Java中)模拟大于整个虚拟内存的文件的内存映射(以TB为单位) 我的问题(6)在下面的大标题下,下面是上下文信息 返回的类ByteBufer的每个实例应该彼此保持一致(在重叠的区域中具有相同的内容)。因此,如果其中一个缓冲区发生更改,其他缓冲区应该在重叠时适当更改。此外,如果更改发生在侦听区域,则应通知侦听器(对于缓冲区,同步和侦听应该是一种单一机制。对于代理视图,同步没有问题,但侦听器问题仍然存在)。这种同步不一定是“超高性能”,但它应该是可靠的。我认为会有很多重叠的缓冲区,但不会有太多的修改。 我假设在大多数情况下,我会从“文件视图”中获得很少的缓冲区(比如2kb) 每次写入都应以某种方式存储在内存中(除了写入缓冲区)。在用户单击“保存”之前,不允许直接写入文件。当然,它不会持续很长时间——我假设不需要在内存中缓存超过200MB的内存(巨大的更改块可以缓存在磁盘上的临时文件中)。这些单独的更改可以分布在整个映射文件中。如果文件中的相邻位置被修改,则可以聚合更改 因此,FileView必须:Java 对1TB文件的读/写缓存-缓冲区上的代理/视图,java,caching,io,buffer,Java,Caching,Io,Buffer,我希望有一个对象(在纯Java中)模拟大于整个虚拟内存的文件的内存映射(以TB为单位) 我的问题(6)在下面的大标题下,下面是上下文信息 返回的类ByteBufer的每个实例应该彼此保持一致(在重叠的区域中具有相同的内容)。因此,如果其中一个缓冲区发生更改,其他缓冲区应该在重叠时适当更改。此外,如果更改发生在侦听区域,则应通知侦听器(对于缓冲区,同步和侦听应该是一种单一机制。对于代理视图,同步没有问题,但侦听器问题仍然存在)。这种同步不一定是“超高性能”,但它应该是可靠的。我认为会有很多重叠的缓
fileView.getBuffer(0,200000000);
fileView.getBuffer(0,200000789);
我们有两个200MB数据块的独立副本。连续调用将生成相同数据的下一个副本。
所以也许fileView应该返回现有内部缓冲区的视图,而不是新的缓冲区?但是,如何产生内部缓冲区呢?这将是“拼凑”。fileView将根据需要在内部创建缓冲区,并返回这些内部缓冲区上的视图,这些缓冲区以某种方式粘合和修补在一起。如下所示-在第四次调用中重用(修补)现有内部缓冲区:
fileView.getBuffer(0,2); // {0,1,2}
fileView.getBuffer(4,5); // {4,5}
fileView.getBuffer(8,12); // {8,9,10,11,12}
fileView.getBuffer(0,16); // {0,1,2} {3} {4,5} {6,7} {8,9,10,11,12} {13,14,15,16}
2。在不破坏视图的情况下清除内部数据(GC)
当内存不足时,我们应该:
- GC未更改的缓冲区(稍后我们可以从HD再次读取它们)李>
- 将更改(写入)也存储在缓存和GC修改的缓冲区中
- 避免在多个缓冲区中使用同一数据的多个独立副本,因此我需要视图
- 在fileView.getBuffer之后(长从,长到);返回功能类似于ByteBuffer的内容
- 与裸奔者相比,不要过分破坏性能 也许我应该返回一个全新类的实例,该类在fileView的内部缓冲区上实现代理视图,并且具有类似于bytebuffer的接口
fileView.getBuffer(0,2); // {0,1,2}
fileView.getBuffer(4,5); // {4,5}
fileView.getBuffer(8,12); // {8,9,10,11,12}
fileView.getBuffer(0,16); // {0,1,2} {3} {4,5} {6,7} {8,9,10,11,12} {13,14,15,16}
char[8] - "File system ID"
uint16 - "Bytes per sector"
uint8 - "Sectors per cluster"
uint16 - "Reserved sectors"
...