Tra*_*ago 5 java io file-io nio real-time
有人对此进行过基准测试吗?我希望尽可能快地写入磁盘,最大限度地减少写入调用的延迟。我想知道写入内存映射缓冲区(通过 buffer.put())是否比仅在 Java 端缓冲内容并在缓冲区满后刷新到 fileChannel 更快。这样,一旦缓冲区已满,我就可以进行系统调用(FileChannel.write)。我不确定当我向 MappedByteBuffer 写入一些字节时会发生什么,换句话说,系统调用是否完成。
通过缓冲方法,我将能够以 16,32 或 64k 的块写入磁盘,我认为这是最佳的。缓冲的缺点是,如果应用程序崩溃,您必须有一个关闭挂钩来刷新内容。还有一层额外的复制到缓冲区,而不是直接写入文件通道。如果您跟踪文件,您可能看不到您想要的内容,因为内容已被缓冲。我也不知道如果跟踪内存映射文件会发生什么。
有哪位有经验的大神可以帮帮忙吗?
如果您想尽量减少延迟,我发现写入 MemoryMappedFiles 会更快,因为它避免了进行系统调用的需要。这假设您不需要将数据强制写入磁盘,并且希望操作系统尽最大努力执行此操作。
写入 MemoryMappedFile 的典型延迟与写入内存相同,所以我不相信你会变得更快。随着文件的增长,您需要执行额外的内存映射区域,这可能需要 50 到 100 微秒,这很重要,但应该很少见,因此并不重要。
通过系统调用写入 IO 大约需要 5 到 10 微秒,这对于更多应用程序来说足够快,但如果重要的话相对要慢得多。
如果您需要查看低延迟写入的数据,我建议您查看我的Java Chronicle库,它支持从写入后以 100 ns 的典型延迟读取数据。
注意:虽然内存映射文件可以减少单个写入的延迟,但它不会增加磁盘子系统的写入吞吐量。这意味着,如果您的磁盘子系统速度较慢,您的内存很快就会耗尽(即使您有很多 GB),无论您采用哪种方法,这都将成为性能瓶颈。
例如,如果您有 SATA 或光纤,则可能有 500 MB/s 的限制,很容易超出,在这种情况下,一旦达到内存限制,无论您选择什么,都会减慢速度。
归档时间: |
|
查看次数: |
3327 次 |
最近记录: |