标签:io file-io nio real-time java
有人基准测试过吗?我想尽可能快地写入磁盘,以最大程度地减少写入调用的延迟.我想知道(通过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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。