14

我创建的一个 python 程序是 IO 有界的。大部分时间(超过 90%)都花在一个重复约 10,000 次的循环中。在这个循环中,大约 100KB 的数据被生成并写入一个临时文件;然后它被另一个程序读回并收集有关该数据的统计信息。这是将数据传递到第二个程序的唯一方法。

由于这是主要瓶颈,我认为将临时文件的位置从我的主 HDD 移动到(~40MB)RAMdisk(在超过 2GB 的可用 RAM 内)将大大提高该文件的 IO 速度,从而减少运行时。但是,我得到了以下结果(每个结果平均超过 20 次):

  • 测试数据1:无RAMdisk - 72.7s,有RAMdisk - 78.6s
  • 测试数据2:无RAMdisk - 223.0s,有RAMdisk - 235.1s

看起来 RAMdisk 比我的 HDD 慢。

这可能是什么原因造成的?

除了使用 RAMdisk 来获得更快的文件 IO,还有其他替代方法吗?

4

6 回答 6

3

您的操作系统几乎可以肯定已经在缓冲/缓存磁盘写入。RAM 磁盘的性能如此接近也就不足为奇了。

在不确切知道您在写什么或如何写的情况下,我们只能提供一般性建议。一些想法:

  • 如果你有 2 GB RAM,你可能有一个不错的处理器,所以你可以将这些数据写入具有压缩的文件系统。假设您的数据可以接受,那将以 I/O 操作换取 CPU 时间。

  • 如果你正在做许多小写,将它们组合起来一次写更大的部分。(我们可以看到源代码吗?)

  • 您是否在使用后删除 100 KB 文件?如果您不需要它,请删除它。否则操作系统可能会被迫将其刷新到磁盘。

于 2010-10-14T00:47:13.940 回答
2

我知道 Windows 非常积极地将磁盘数据缓存在 RAM 中,并且 100K 很容易满足。写入将直接进入缓存,然后可能通过非阻塞写入写入磁盘,从而允许程序继续。RAM 磁盘可能不支持非阻塞操作,因为它希望这些操作快速且不值得费心。

通过减少程序和缓存可用的内存量,您将增加用于分页的磁盘 I/O 量,即使只是略微增加。

这都是我的猜测,因为我不熟悉内核或驱动程序。我还推测 Linux 会以类似方式运行。

于 2010-10-14T00:47:27.230 回答
2

您可以将数据分批写入而不是一次写入一项吗?您是在缓存打开文件句柄等资源还是清理它们?您的磁盘写入是否阻塞,您能否使用后台线程使 IO 饱和,同时不影响计算性能。

我会首先考虑优化磁盘写入,然后在完成后查看更快的磁盘。

于 2010-10-14T00:34:14.363 回答
1

在我的测试中,我发现不仅批量大小会影响整体性能,还会影响数据本身的性质。仅在一种情况下,与 SSD 相比,我设法获得了 5 倍的写入时间:将 100MB 的预煮随机字节数组块写入 RAM 驱动器。写入更多“可预测”的数据,如字母“aaa”或当前日期时间会产生完全相反的结果——SSD 总是更快或相等。所以我的猜测是操作系统(在我的例子中是 Win 7)做了很多缓存和优化。看起来 RAM 驱动器最受阻碍的情况是当您执行大量小写入而不是一些大写入时,RAM 驱动器擅长写入大量难以压缩的数据。

于 2016-05-17T12:36:52.270 回答
0

我有同样令人难以置信的经历,经过多次尝试,我想通了。当 ramdisk 格式化为 FAT32 时,即使基准测试显示高值,实际使用实际上比 NTFS 格式化 SSD 慢。但 NTFS 格式的 ramdisk 在现实生活中比 SSD 更快。

于 2013-06-07T23:43:01.820 回答
0

我加入了对 RAM 磁盘速度有问题的人(仅在 Windows 上)。

我拥有的 SSD 可以写入 30 GiB(在一个大块中,转储一个 30GiB RAM 阵列),速度为 550 MiB/s(写入 30 GiB 大约需要 56 秒)......这是如果在一个来源中询问写入代码句。

我拥有的 RAM 磁盘 (imDisk) 可以写入 30 GiB 写入(在一个大块中,转储一个 30GiB RAM ARRAY),速度略低于 100 MiB/s(大约 5 分 13 秒写入 30 GiB)。 ..这是在一个源代码句子中询问写入的情况。

我还做了另一个 RAM 测试:从源代码执行顺序直接写入(每个源代码循环传递一个字节)到 30GiB RAM ARRAY(我有 64GiB 的 RAM),我的速度接近 1.3GiB/s(1298每秒 MiB)。

为什么在地狱(在 Windows 上)RAM 磁盘对于一个大的连续写入来说如此缓慢?

当然,低写入速度发生在 Windows 上的 RAM 磁盘上,因为我在 Linux 上使用 Linux 本机 ram 磁盘测试了相同的“概念”,而 Linux ram 磁盘可以以接近每秒 1 GB 的速度写入。

请注意,我还在 Windows 上测试了 SoftPerfect 和其他 RAM 磁盘,RAM 磁盘速度几乎相同,不能以每秒超过 100 兆字节的速度写入。

实际测试的 Windows:10 和 11(在 HOME 和 PRO 上,在 64 位上),RAM 磁盘格式(exFAT 和 NTFS);由于 RAM 磁盘速度太慢,我试图找到一个 RAM 磁盘速度正常的 Windows 版本,但没有找到。实际测试的 Linux 内核:只有 5.15.11,因为 Linux 本机 RAM 磁盘速度正常,所以我没有在任何其他内核上进行测试。

希望这对其他人有所帮助,因为知识是解决问题的基础。

于 2021-12-24T09:43:18.417 回答