【问题标题】:Why are matrices (in R) so much slower and larger than image files that contain the same data?为什么矩阵(在 R 中)比包含相同数据的图像文件慢得多且大得多?
【发布时间】:2016-02-02 15:39:44
【问题描述】:

我正在处理原始成像质谱数据。这种数据与传统的图像文件非常相似,除了不是 3 个颜色通道,我们有对应于我们正在测量的离子数量(在我的例子中为 300)的通道。数据最初以专有格式存储,但可以导出为 .txt 文件作为表格,格式如下:

x, y, z, i(强度),m(质量)

您可以想象,这些文件可能很大。典型的图像可能是 256 x 256 x 20,即 1310720 像素。如果每个都有 300 个质量通道,则这将给出一个包含 393216000 行和 5 列的表。这是巨大的!因此不适合记忆。即使我选择较小的数据子集(例如单个质量),文件的处理速度也很慢。相比之下,专有软件能够非常快速地加载和处理这些文件,例如只需一两秒钟即可将文件打开到内存中。

我希望我已经说清楚了。谁能解释一下?包含基本完全相同数据的两个文件怎么会具有如此不同的大小和速度?如何更快地处理图像数据矩阵?

【问题讨论】:

    标签: r performance image-processing matrix


    【解决方案1】:

    谁能解释一下?

    是的

    两个包含基本相同数据的文件怎么会有如此不同的大小和速度?

    R 使用双精度数是默认数字类型。因此,数据帧的存储空间约为 16Gb。专有软件很可能使用浮点作为底层类型,从而将内存需求减少到 8Gb。

    如何更快地处理图像数据矩阵?

    购买一台 32Gb 的电脑。即使是 32Gb 的计算机,考虑在 R 中使用 data.table 并通过引用完成操作,因为 R 喜欢复制数据帧。

    或者您可能希望转移到 Python/pandas 进行处理,显式使用 dtype=float32

    更新

    如果你想留在R,看看bigmemory包,link,虽然我会说处理它不适合心软的人

    【讨论】:

    • 感谢您的回复。我能够通过以下方式显着提高性能: - 将数据转换为整数格式而不是浮点数 - 并行化瓶颈,例如数据导入 - 交换到 64GB ram 计算机 我想较低的性能是使用人类可读文件所付出的代价。
    • @DGreenwood 不客气。在处理 R 中的矩阵时要尝试的另一件事是使用 Microsoft 的 R。他们将矩阵计算卸载到英特尔 MKL,因此在英特尔硬件上它会更快一些。链接:mran.revolutionanalytics.com/open
    • 再次感谢,这很有帮助。我会尝试革命R,让你知道性能的提升是什么!
    • @DGreenwood 祝你好运。仅供参考,当我说“英特尔硬件上的英特尔 MKL 更快一些。”时,它也适用于英特尔协处理器卡 Xeon Phi。不过,它是相当昂贵的硬件……链接:blog.revolutionanalytics.com/2015/05/…
    【解决方案2】:

    这个问题的答案对我的数据集来说有点深奥,而且非常具体,但其他人可能会感兴趣。我的数据非常稀疏 - 即我的矩阵中的大多数值都为零。因此,我能够使用 Matrix 包(大写重要)显着减小数据大小,该包旨在更有效地处理稀疏矩阵。为了实现这个包,我只插入了一行:

    data <- Matrix(data)
    

    节省的空间量会因数据集的稀疏性而异,但在我的情况下,我将 1.8 GB 减少到 156 Mb。 Matrix 的行为与 matrix 一样,因此无需更改我的其他代码,速度也没有明显变化。稀疏性显然是专有格式可以利用的东西。

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 2015-07-01
      • 2017-12-22
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2015-07-19
      • 2013-07-16
      • 2016-10-10
      相关资源
      最近更新 更多