performance - 压缩以提高硬盘写入性能

标签 performance compression io

在现代系统上,可以通过压缩输出流来提高本地硬盘写入速度吗?

这个问题源 self 正在处理的一个案例,其中一个程序串行生成并将大约 1-2GB 的文本日志数据转储到硬盘上的原始文本文件,我认为它是 IO 绑定(bind)的。我是否希望能够通过在数据进入磁盘之前对其进行压缩来减少运行时间,或者压缩的开销是否会耗尽我可以获得的任何 yield ?空闲的第二个核心会影响这个吗?

我知道这会受到用于生成数据的 CPU 数量的影响,因此关于需要多少空闲 CPU 时间的经验法则会很好。

<小时/>

我记得在一次视频演讲中,有人使用压缩来提高数据库的读取速度,但 IIRC 压缩比解压缩消耗更多的 CPU 资源。

最佳答案

是的,是的,是的,绝对的。

这样看:以每秒兆字节为单位计算最大连续磁盘写入速度。 (继续测量它,对一个巨大的写入或其他东西进行计时。)比方说 100mb/s。现在以兆赫为单位计算 CPU 速度;假设 3Ghz = 3000mhz。将 CPU 速度除以磁盘写入速度。这是 CPU 空闲的周期数,您可以在压缩上花费每字节的周期数。在本例中,3000/100 = 每字节 30 个周期。

如果您有一种算法可以将数据压缩 25%,从而达到 125mb/s 的有效写入速度,那么每个字节将有 24 个周期来运行它,并且它基本上是免费的,因为在等待磁盘转动时,CPU 不会做任何其他事情。每字节 24 个周期 = 每 128 字节缓存线 3072 个周期,很容易实现。

我们在读取光学介质时一直这样做。

如果您有一个空闲的第二个核心,那就更容易了。只需将日志缓冲区交给该核心的线程,它就可以花尽可能长的时间来压缩数据,因为它没有做任何其他事情!唯一棘手的一点是您实际上希望拥有一圈缓冲区,这样您就不会让生产者线程(生成日志的线程)在互斥体上等待消费者线程(将其写入磁盘的线程)的缓冲区正在举行。

关于performance - 压缩以提高硬盘写入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431594/

相关文章:

java - jsp:include,性能,模块化,备选方案和最佳实践,第 96 部分

performance - 是什么导致了这个过多的 "Composite Layers"、 "Recalculate Style"和 "Update Layer Tree"循环?

performance - Jmeter :- Running a bundle of samplers sequentially within concurrent threads

compression - 存储时间序列的有效方法是什么?

ruby - 用于压缩/加密字符串的 native ruby​​ 方法?

compression - 二进制数据的最佳压缩技术?

c++ - Windows C++ 上的 std::fstream 读取文件

c - 如何在 C 中刷新输入流?

Ruby sysread IO 太慢了

performance - 为什么 MOVNTI 不更慢,在循环中重复存储到同一地址?