gpt4 book ai didi

c# - 通过 2TB 文件的文件偏移量随机读取许多 300 字节 block 的最快方法?

转载 作者:可可西里 更新时间:2023-11-01 08:12:23 25 4
gpt4 key购买 nike

我在 RAID 5 (4 x 7.2k @ 3TB) 系统上有一些 2TB 只读(创建后不可写入)文件。

现在我有一些线程想要读取该文件的部分内容。每个线程都有一个它需要的 block 数组。每个 block 都由要读取的文件偏移量(位置)和大小(通常约为 300 字节)寻址。

读取这些数据最快的方法是什么。我不关心 CPU 周期,(磁盘)延迟才是最重要的。因此,如果可能的话,我想利用硬盘的 NCQ。

由于文件是高度压缩的并且会随机访问,而且我知道确切的位置,所以我没有其他方法可以优化它。

  • 我应该将文件读取集中到一个线程吗?
  • 我应该让文件保持打开状态吗?
  • 如果每个线程(可能大约 30 个)都同时打开每个文件,那么(来自网络服务器的)新线程怎么办?
  • 如果我等待 100 毫秒并按文件偏移量对读数进行排序(从小到大),会有帮助吗?

读取数据的最佳方式是什么?您有经验、技巧、提示吗?

最佳答案

并行请求的最佳数量在很大程度上取决于您的应用程序之外的因素(例如磁盘计数=4、NCQ 深度=?、驱动程序队列深度=?...),因此您可能希望使用一个能够适应的系统或被改编。我的建议是:

  • 将所有读取请求连同一些允许通知请求线程的元数据一起写入队列
  • 让 N 个线程从该队列中出队,同步读取 block ,通知请求线程
  • 使 N 运行时可变
  • 由于 CPU 不是您关心的问题,您的工作线程可以计算 float 延迟平均值(和/或最大值,具体取决于您的需要)
  • 上下滑动 N,直到达到最佳点

为什么要同步读取?它们的延迟低于异步读取。为什么要在队列上浪费延迟?一个好的无锁队列实现从小于 10ns 的延迟开始,远小于两次线程切换

更新:一些问答

读取线程是否应该保持文件打开? 是的,绝对如此。

您会使用带有 FileOptions.RandomAccess 的 FileStream 吗?

你写“同步读取 block ”。这是否意味着每个读取线程都应该在将读取 block 的命令出列后立即开始从磁盘读取 block ? 是的,我就是这个意思。读取请求的队列深度由线程数管理。

关于c# - 通过 2TB 文件的文件偏移量随机读取许多 300 字节 block 的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8897799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com