使用BinaryReader读取大文件(> 1 GB)时,最佳缓冲区大小是多少?

阿米尔(Amir Pournasserian)

我正在读取二进制文件,这是一个示例:

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16*1024];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        ......
    }

}

显然,缓冲区大小(16 * 1024)对性能起着很大的作用。我已经读到它取决于I / O技术(SATASSDSCSI等),还取决于该文件上存在的分区的片段大小(我们可以在格式化分区时定义)。

但是这里有一个问题:是否有任何公式或最佳实践来定义缓冲区大小?现在,我正在基于反复试验进行定义。

编辑:我已经在服务器上使用不同的缓冲区大小测试了该应用程序,并且使用4095 * 256 * 16(16 MB)获得了最佳性能!4096慢4秒。

以下是一些较旧的帖子,它们非常有帮助,但我仍然无法找到原因:

用户名

.NET的顺序文件编程模式和性能”是有关I / O性能改进的精彩文章。

PDF文件的第8页中,它表明大于8个字节的缓冲区大小的带宽是恒定的。考虑到本文是在2004年编写的,硬盘驱动器是“ Maxtor 250 GB 7200 RPM SATA磁盘”,其结果应该与最新的I / O技术有所不同。

如果您正在寻找最佳性能,请查看pinvoke.net或PDF文件的第9页,非缓冲文件性能测量显示出更好的结果:

在无缓冲的I / O中,磁盘数据直接在应用程序的地址空间和设备之间移动,而无需任何中间复制。

概要

  • 对于单个磁盘,请使用.NET框架的默认值-它们为顺序文件访问提供了出色的性能。
  • 创建文件时,预先分配较大的顺序文件(使用SetLength()方法)。与碎片文件相比,这通常可以将速度提高约13%。
  • 至少就目前而言,磁盘阵列需要非缓冲I / O才能达到最高性能-缓冲I / O的速度可能比非缓冲I / O慢八倍。我们希望此问题将在.NET框架的更高版本中得到解决。
  • 如果您自己进行缓冲,请使用较大的请求大小(64 KB是一个不错的起点)。使用.NET框架,单个处理器可以使用未缓冲的I / O以超过800 MB / s的速度读写磁盘阵列。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中通过套接字传输文件的缓冲区大小应该是多少

来自分类Dev

如何在lua中读取大文件(> 1GB)?

来自分类Dev

我应该使用GLSL或OpenCL制作raytracer,如何获得较大的1gb缓冲区?

来自分类Dev

使用Node.js的最佳缓冲区大小?

来自分类Dev

如何使用asyncio / aiohttp确定最佳的缓冲区大小

来自分类Dev

如何使用Angular的httpClient下载大文件(> 1GB)?

来自分类Dev

确定在 linux 中读取文件的最佳缓冲区大小

来自分类Dev

为什么逐行读取文件时缓冲区大小不是总是4096的整数倍?

来自分类Dev

使用WriteableBitmap的缓冲区大小不足?

来自分类Dev

使用DataReader时,网络缓冲区中可以存储多少数据

来自分类Dev

StreamWriter的默认缓冲区大小是多少

来自分类Dev

使用Python从1个进程使用HDF5和MPI写入/读取大文件

来自分类Dev

使用Python从1个进程使用HDF5和MPI写入/读取大文件

来自分类Dev

从文件读取时如何停止堆栈缓冲区溢出?

来自分类Dev

读取MTOM数据时已超过最大缓冲区大小

来自分类Dev

使用glReadPixels(...)读取帧缓冲区时精度较低

来自分类Dev

使用套接字时重用读取缓冲区

来自分类Dev

使用bigquery api时表被截断(缓冲区大小问题?)

来自分类Dev

如何在到达缓冲区而不是缓冲区已满时读取缓冲区中的数据?

来自分类Dev

使用协议缓冲区从文件读取消息时出现问题

来自分类Dev

防止超大缓冲区文件的最佳方法?

来自分类Dev

从套接字读取而不知道缓冲区的大小

来自分类Dev

如何获得底层套接字读取缓冲区的大小?

来自分类Dev

使用缓冲区读取JPEG文件:segfault

来自分类Dev

使用Python读取协议缓冲区文件

来自分类Dev

文件I / O中的缓冲区大小

来自分类Dev

确定文件大小以在c中分配缓冲区

来自分类Dev

通过套接字发送文件 - 缓冲区大小

来自分类Dev

文件大小和缓冲区超调

Related 相关文章

  1. 1

    Java中通过套接字传输文件的缓冲区大小应该是多少

  2. 2

    如何在lua中读取大文件(> 1GB)?

  3. 3

    我应该使用GLSL或OpenCL制作raytracer,如何获得较大的1gb缓冲区?

  4. 4

    使用Node.js的最佳缓冲区大小?

  5. 5

    如何使用asyncio / aiohttp确定最佳的缓冲区大小

  6. 6

    如何使用Angular的httpClient下载大文件(> 1GB)?

  7. 7

    确定在 linux 中读取文件的最佳缓冲区大小

  8. 8

    为什么逐行读取文件时缓冲区大小不是总是4096的整数倍?

  9. 9

    使用WriteableBitmap的缓冲区大小不足?

  10. 10

    使用DataReader时,网络缓冲区中可以存储多少数据

  11. 11

    StreamWriter的默认缓冲区大小是多少

  12. 12

    使用Python从1个进程使用HDF5和MPI写入/读取大文件

  13. 13

    使用Python从1个进程使用HDF5和MPI写入/读取大文件

  14. 14

    从文件读取时如何停止堆栈缓冲区溢出?

  15. 15

    读取MTOM数据时已超过最大缓冲区大小

  16. 16

    使用glReadPixels(...)读取帧缓冲区时精度较低

  17. 17

    使用套接字时重用读取缓冲区

  18. 18

    使用bigquery api时表被截断(缓冲区大小问题?)

  19. 19

    如何在到达缓冲区而不是缓冲区已满时读取缓冲区中的数据?

  20. 20

    使用协议缓冲区从文件读取消息时出现问题

  21. 21

    防止超大缓冲区文件的最佳方法?

  22. 22

    从套接字读取而不知道缓冲区的大小

  23. 23

    如何获得底层套接字读取缓冲区的大小?

  24. 24

    使用缓冲区读取JPEG文件:segfault

  25. 25

    使用Python读取协议缓冲区文件

  26. 26

    文件I / O中的缓冲区大小

  27. 27

    确定文件大小以在c中分配缓冲区

  28. 28

    通过套接字发送文件 - 缓冲区大小

  29. 29

    文件大小和缓冲区超调

热门标签

归档