【问题标题】:Fast reading from hard drive从硬盘快速读取
【发布时间】:2012-07-09 14:06:30
【问题描述】:

我已经基于两个文件创建了一个虚拟文件系统(非常类似于 fat)。

  1. 第一个文件 - 分配表。

它存储有关文件分配的信息(实际上它不是文件但不关心它)

每条记录的结构如下:

  1. 名称 - 固定大小(100 字节)。前 4 个字节是字符串长度
  2. 长度 - 4 个字节,文件总长度
  3. StartCluster - 起始集群的 4 字节 id
  4. EndCluster - 结束簇的 4 字节 id

每个条目都有固定的大小,我在内存中有哈希表,可以帮助我找到每个条目的位置。

  1. 第二个文件 - 虚拟驱动器

基于集群的 VD。每个集群都有固定的大小 - 256 字节。最后 4 个字节是指向文件链中下一个簇的指针。

当我尝试读取所有文件时,问题是速度非常慢。我怎样才能提高性能?有什么快速从硬盘读取的技巧吗?

例如:按大块读取文件是个好主意吗?当我读取文件的一小部分时,文件被操作系统缓存对吗?下一次我只是从内存而不是从 HD 中获取数据?

我有几个这样的问题可以在哪里得到答案?

【问题讨论】:

  • 你看过内存映射文件吗?
  • 如果块大小等于给定 CPU/OS 上的内存页面大小,则可以改进磁盘访问。
  • @leppie 我的第二个文件非常零散。所以我经常需要随机搜索阅读。 mmf 可以帮我吗?
  • 你说读取所有文件时速度慢。那么只读取一个文件很快吗?
  • “慢”有多慢?您期望的时机是什么,现实情况如何?

标签: c# performance io


【解决方案1】:

一些选项;

  • 您可以扩大集群大小(256 字节很小,现在大多数操作系统使用 4KB 以上的集群)

  • 如果您读取所有文件,则可以根据 startCluster 进行排序,以便按照文件在磁盘上物理上彼此靠近的顺序读取文件。因此,每当操作系统获取 4K+ 块时,您更有可能在下一个文件中需要它的其他部分。

  • 您可以对虚拟磁盘文件进行碎片整理

  • 您似乎确信这是磁盘读取问题。您是否检查过您在阅读文件后对文件所做的操作不是慢速部分?

  • 大量随机访问是 SSD 存储的亮点。将虚拟磁盘移至 SSD

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2012-05-15
    • 2011-10-31
    • 2019-03-20
    • 2017-08-17
    • 2011-01-09
    相关资源
    最近更新 更多