带有流的文件 I/O - 最佳内存缓冲区大小

     2023-03-05     285

关键词:

【中文标题】带有流的文件 I/O - 最佳内存缓冲区大小【英文标题】:File I/O with streams - best memory buffer size 【发布时间】:2011-03-03 07:17:20 【问题描述】:

我正在编写一个小型 I/O 库来协助一个更大的(爱好)项目。该库的一部分对文件执行各种功能,通过FileStream 对象读取/写入。在每个StreamReader.Read(...) 传递中,

我触发了一个事件,该事件将在主应用程序中用于显示进度信息。循环中进行的处理是多种多样的,但不会太耗时(例如,它可能只是一个简单的文件副本,或者可能涉及加密......)。

我的主要问题是:使用的最佳内存缓冲区大小是多少?考虑物理磁盘布局,我可以选择 2k,这将覆盖一个 CD 扇区大小,并且是 512 字节硬盘扇区的一个很好的倍数。在抽象树的更高层,您可以选择更大的缓冲区,一次可以读取整个 FAT 簇。我意识到,对于今天的 PC,我可以选择更消耗内存的选项(例如,几个 MiB),但随后我会增加 UI 更新之间的时间,并且用户会感觉到应用程序的响应速度较慢。

顺便说一句,我最终希望为托管在 FTP/HTTP 服务器上的文件(通过本地网络/fastish DSL)提供类似的接口。对于那些来说,最好的内存缓冲区大小是多少(同样,感知响应能力与性能之间的“最佳情况”权衡)?

【问题讨论】:

可能会有帮助:***.com/questions/19558435/… 我原以为操作系统或 Windows 会维护自己的硬件功能和速度配置文件,并提供一项服务,为给定的存储量和活动推荐最佳缓冲区大小(例如随机读取/writes vs 顺序读/写) - 这将消除猜测。 C# FileStream : Optimal buffer size for writing large files?的可能重复 【参考方案1】:

当我直接通过流对象处理文件时,我通常使用 4096 字节。它似乎在多个 I/O 区域(本地文件系统、LAN/SMB、网络流等)上相当有效,但我还没有分析它或任何东西。很久以前,我看到几个例子使用了这个尺寸,它留在了我的记忆中。但这并不意味着它是最好的。

【讨论】:

对。我永远不会使用小于 4k 的任何东西,因为它是由虚拟内存系统(磁盘缓存所基于)管理的最小块。【参考方案2】:

“视情况而定”。

您必须使用不同的缓冲区大小测试您的应用程序以确定最佳选择。你无法提前猜测。

【讨论】:

【参考方案3】:

文件已被文件系统缓存缓冲。您只需要选择一个缓冲区大小,该大小不会强制 FileStream 使本机 Windows ReadFile() API 调用过于频繁地填充缓冲区。不要低于 1 KB,超过 16 KB 会浪费内存,并且对 CPU 的 L1 cache(通常为 16 或 32 KB 的数据)不友好。

4 KB 是一个传统的选择,即使它恰好跨越一个虚拟内存页面只是偶然。很难描述;您最终将测量读取缓存文件需要多长时间。如果数据在缓存中可用,它以 RAM 速度运行,5 GB/秒或更高。它将在您第二次运行测试时在缓存中,而这在生产环境中不会经常发生。文件 I/O 完全由磁盘驱动器或NIC 主导,而且速度非常慢,复制数据是小菜一碟。 4 KB 就可以了。

【讨论】:

较小的缓冲区大小(如 4-8kb)也是可取的,因为 CPU 缓存可以容纳这样的数量。但是,如果您选择较小,则可能会从内核转换中积累大量开销。 @HansPassant:我的应用程序同时处理大量小文件以及单独处理大文件。 4KB 大小是否会对小于 4KB 的文件的性能产生不利影响? 4KB 是 .net 框架使用的默认值:msdn.microsoft.com/en-us/library/dd783870.aspx 如果文档正确,在 4.5 中他们将默认值增加到 81920。 文档是正确的,.NET Reflector 显示 _DefaultCopyBufferSize 的值为 0x14000(81920 或 80K)。但是,这是用于从流复制到流,而不是缓冲数据。 BufferedStream Class 有一个 _DefaultBufferSize0x1000(4096 或 4k),这将是一个更好的类来了解 .NET 框架用于流的缓冲区大小。【参考方案4】:

我认为默认值通常是最好的 - 因此我在internal const int 变量DefaultBufferSize 中使用4096B FileStream 类。

【讨论】:

默认并不总是最好的。对于更常见的情况,这只是一个很好的折衷方案,而不是所有负载的最佳选择。

nio流的学习(代码片段)

NIO的使用一)、什么叫NIO?定义:是一套新的JavaI/O标准,在java1.4中被纳入JDK中。二)、NIO的实现方法NIO是基于块的,以块为基本单位处理数据。标准的I/O是基于流实现的,以字节为单位处理数据。三)、NIO的特性1).为所有的原始... 查看详情

读-处理-写的最佳缓冲区大小

】读-处理-写的最佳缓冲区大小【英文标题】:OptimalBuffersizeforread-process-write【发布时间】:2013-03-1013:28:25【问题描述】:在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。该文件大小未... 查看详情

i/o:filechannel(代码片段)

...abstractintread(ByteBufferdst):将字节序列从此通道读入给定的缓冲区 查看详情

i/o模型介绍(代码片段)

...:?第一步:将数据从磁盘文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长?第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短I/O模型Linux下的五种I/O模型1)阻塞I/O(blockingI/O)2)非阻塞I/... 查看详情

流与缓冲

...目的:  为了使程序的运行效率最高,流对象通常提供缓冲区来减少调用系统I/O库函数的次数。2三大缓冲:  全缓冲:缓冲区满才调用系统I/O函数。对于读操作,知道读取的字节数等于了缓冲区大小或者说到了文件的末尾... 查看详情

文件i/o

文件I/O1.C标准函数与系统函数的区别1.c标准函数和系统函数的区别接下来用应用层API的知识。每当打开一个文件,默认打开标准输入,标准输出,标准出错流,每个FILE都对应一个缓冲区,默认大小为8192Byte。  查看详情

《文件与i/o流》第3节:字节流的使用

...定义的字节流。表12-4字节流类流类用途InputStream字节输入流的父类OutputStream字节输出流的父类BufferedInputStream缓冲输入流BufferedOutputStream缓冲输出流ByteArrayInputStream从字节数组读取的输入流ByteArrayOutputStream向字 查看详情

不用怀疑!这就是把java.i/o流讲解的最清楚的一篇文章

本文目录简单梳理理解对于文件流来说是io流的基础,牵扯到缓冲流,缓冲流是在内存中使用io流的各类操作,转换流顾名思义,是字节与字符流之间的转换,要先有字节流和字符流,对象流,最主要的是类的序列化与反序列化... 查看详情

不用怀疑!这就是把java.i/o流讲解的最清楚的一篇文章

本文目录简单梳理理解对于文件流来说是io流的基础,牵扯到缓冲流,缓冲流是在内存中使用io流的各类操作,转换流顾名思义,是字节与字符流之间的转换,要先有字节流和字符流,对象流,最主要的是类的序列化与反序列化... 查看详情

如何为多个文件处理选择最佳 I/O 策略?

】如何为多个文件处理选择最佳I/O策略?【英文标题】:HowtochoosebestI/Ostrategyformultiplefilesprocessing?【发布时间】:2017-06-2609:46:08【问题描述】:假设我们有下一个任务(非常抽象):我们有一个文件夹,其中包含要处理的不同数... 查看详情

什么时候应该使用带有 Java NIO 的直接缓冲区进行网络 I/O 的简单规则?

】什么时候应该使用带有JavaNIO的直接缓冲区进行网络I/O的简单规则?【英文标题】:AsimpleruleofwhenIshouldusedirectbufferswithJavaNIOfornetworkI/O?【发布时间】:2012-08-2415:46:27【问题描述】:具有以简单直接的方式解释复杂事物的天赋的人... 查看详情

c和指针第十五章文件i/o和二进制i/o

...构struct_iobuf{char*_ptr;//文件输入的下一个位置int_cnt;//当前缓冲区的相对位置char*_base;//指基础位置(应该是文件的其始位置)int_flag;//文件标志int_file;//文件的有效性验证int_charbuf;//检查缓冲区状况,如果无缓冲区则不读取int_bufsiz;//文... 查看详情

bytebuffer常用方法详解

缓冲区(Buffer) 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就... 查看详情

系统i/o与底层(代码片段)

...3、文件描述符分配规则C语言下的三大标准文件四、用户缓冲区与内核缓冲区1、缓冲区刷新策略2、子进程与缓冲区3、缓冲区的意义4、标准I/O与系统I/O对比五、重定向1、系统调用dup2()2、重定向操 查看详情

javanio和io的区别

...自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。传统的IO操作属于阻塞型,严重影响程序的运行速度。2,。流与块的比较。原来的I/O库(在java.io.*中)与NIO最重要的区别是... 查看详情

nio入门(代码片段)

...目录NIO入门输入/输出:概念性描述流与块的比较通道和缓冲区缓冲区缓冲区类型通道通道类型实践:NIO的读与写从文件中读取写入文件读写结合缓冲区内部细节状态变量访问方法get()方法put()方法类型化的get()和put()方法关于缓冲... 查看详情

对文件i/o,标准i/o的缓冲的理解

1.标准I/O缓冲区要理解标准I/O,就要先知道文件I/O的业务逻辑。下面图示为文件I/O如执行下面的代码:  write(fd,buf2,sizeof(buf2));图中 buf:就是buf2。 缓冲区:是文件系统的页缓存。 当执行写操作时,buf中的数据... 查看详情

带有 I/O 完成端口的异步操作返回 0 字节传输

...操作返回0字节传输,尽管I/O操作按预期工作(我的读取缓冲区已满)。BYTEbuffer[1024]=0;OVERLAPPEDo=0;HANDLEfile=CreateFile( 查看详情