系统相关
首页 > 系统相关> > Java-快速编写:内存映射文件与BufferedWriter

Java-快速编写:内存映射文件与BufferedWriter

作者:互联网

有人基准测试过吗?我想尽可能快地写入磁盘,以最大程度地减少写入调用的延迟.我想知道(通过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的限制,很容易超过该限制,在这种情况下,一旦达到内存限制,无论您选择什么,都会使速度变慢.

标签:io,file-io,nio,real-time,java
来源: https://codeday.me/bug/20191031/1978091.html