1

我有一个大于主内存的数据集。压缩后,它适合内存。但是,内存中的解压缩是一种计算密集型的。与访问硬盘中的未压缩数据相比,内存中解压在完成时间方面有什么优势吗?假设来自 HDD 的数据将全部加载到内存中(即在处理过程中不会随机访问 HDD)。任何人以前都做过任何基准测试。谢谢。

4

4 回答 4

5

首先,数据必须是可压缩的。如果没有压缩,那么显然压缩到硬盘并解压回来会更慢。HDD 上的许多文件是不可压缩的,因为它们已经被压缩,例如图像文件、视频文件、音频文件和无损压缩档案,如 zip 或 .tar.gz 文件。

如果是可压缩的,zlib解压很可能比HDD读取快,lz4解压很有可能更快。

这是经典的问题,只能用“取决于”和“你需要根据你的情况来衡量”来正确回答。

于 2012-10-25T02:49:23.993 回答
4

如果您的解压缩速度至少与 HDD 读取数据的速度一样快,并且与磁盘读取并行解压缩,那么压缩数据的读取几乎总是会更快(较小文件的读取将更快完成,并且解压缩只会增加最后一个块)。

根据这个基准,一个相当弱的 CPU可以以超过 60MB/s 的速度解压缩 gzip。

于 2012-10-24T15:13:17.453 回答
2

这取决于您的数据、处理方式以及机器的规格。如果不分析您的确切情况,一些考虑因素几乎不可能回答:

  • 你的压缩效果如何?不同的压缩算法使用不同数量的 CPU。
  • 数据是如何使用的?在处理之前需要缓冲的数据量会影响在解压和处理之间可以多线程的数量,这将极大地影响你的答案。
  • 你的环境是什么?具有 1TB 数据要处理的 16 核服务器与具有 1GB 数据的精美手机有很大不同,但是从您的问题中不清楚您正在处理哪个(HDD 建议至少使用计算机而不是手机,但是服务器vs桌面仍然相关)。
  • 加载数据后,您进行了多少随机访问?您建议加载后不会随机访问 HDD,但如果您要加载完整的压缩数据并且一次只解压缩一部分数据,那么访问数据的模式很重要 - 您可能已经解压缩一切都要处理两次(或更多!)。

归根结底,这个问题非常主观,如果您认为性能差异很重要,我建议您创建一些基本的测试场景并进行大量配置。

举一个更具体的例子:如果您正在执行重型音频或视频处理,则该过程是 CPU 密集型的,但通常会接受数据流。在这种情况下,压缩可能会减慢您的速度,因为瓶颈将是 CPU。

或者,如果您从文件中读取十亿行文本并计算每个文本中元音的总数,您的磁盘 IO 可能会成为瓶颈,您将受益于减少磁盘 IO 并通过解压缩更努力地工作 CPU文件。

于 2012-10-24T15:26:42.597 回答
2

在我们的案例中,我们优化了批处理代码,该代码将在批处理模式下通过结构化消息(阅读:推文);将表示从 JSON 切换到,并使用 映射整个文件mmap,我们进入了一种明显受 I/O 限制的状态,磁盘速度是限制因素。

我们发现大部分包含 UTF-8 文本的ed 消息可以使用LZ4msgpack以 3-4 的压缩比进行压缩;在切换到 LZ4 解压后,我们优化的代码仍然是 I/O-bound,但吞吐量显着增加。

在您的情况下,我将开始尝试 LZ4。

于 2018-05-18T19:40:25.533 回答