【问题标题】:Read a huge matrix file in C在 C 中读取一个巨大的矩阵文件
【发布时间】:2012-01-20 17:54:44
【问题描述】:

我有一个巨大的100,000x100,000matrix(txt 文件),我用它来计算遗传算法中染色体的适应度。我的人口规模是 100,世代规模是 1000。所以我正在阅读这个文件 100,000 次。

GA 是用C 写的,我不熟悉C。在C 中读取此矩阵文件的有效方法是什么?有没有其他方法可以优化这个。

谢谢。

Edit:

对不起,它是一个 100,000 X 100,000 的矩阵文件。我无法将其保存在内存中,因为它需要大约 37GB。我想在每次需要时阅读。

【问题讨论】:

  • 最近有一个关于类似主题的问题:stackoverflow.com/questions/8945059/… 你也会对strtokatof 感兴趣。
  • 我希望你有很多内存,假设你使用 32 位整数,100 个矩阵副本将占用 40GB 内存。
  • 你为什么要阅读它 100,000 次?文件是否在两次读取之间修改?
  • @han:嗯,把那么多钱花在一个可以通过简单地使用正确的软件方法来解决的问题上似乎相当...浪费和不必要的。
  • @DarkDust:我同意你的观点,但如果这是一个真正的业务问题(或资金充足的研究项目中的次要问题),那么不应排除硬件选项。

标签: c file optimization file-io matrix


【解决方案1】:

了解mmap(),这对于大文件很有用。

【讨论】:

    【解决方案2】:

    您对矩阵中的数据了解多少?数据大部分是零,所以矩阵是sparse?如果是这种情况,那么只需要存储非零元素。 Here 是一个用于稀疏矩阵运算的示例 C 库。

    矩阵中有symmetry吗?比如对角对称,只需要存储一半的数据。

    编辑添加:

    您的输入数据中显然没有 37GB 的数学 information,因此矩阵中的大部分数据都可以丢弃而不影响程序的结果。我猜想小于某个值的矩阵元素可以被刷新为零,如果它还不是稀疏的,这将具有将矩阵转换为稀疏矩阵的效果。

    【讨论】:

      【解决方案3】:

      为什么每次都需要重新读取文件?您可以只读取一次并将其保存在内存中,这样您就不必担心优化文件的读取,因为它已经完成了一次。假设这是一个浮点矩阵并且一个浮点是 4 个字节,10000*10000*4/1024/1024 = 381MBs

      编辑: 如果它是 100000x100000,那么我认为您可以将浮点值缩放到字节 (0-255),这样您只需要 9GB 而不是 40GB。

      【讨论】:

      • 对不起,它是一个 100,000 X 100,000 矩阵文件。我无法将其保存在内存中,因为它需要大约 37GB。我想在每次需要时阅读
      • 这是 100,000 x 100,000 而不是 10,000 x 10,000。
      • 我明白了,那么不,我不认为有办法避免交换,即使使用 mmap,但是,您可以通过这种方式将浮点值缩放为字节 (0-255)只有 9GB 而不是 40GB
      【解决方案4】:

      正如 Alex Reynold 已经写的那样,mmap 是访问文件的方法。它简单、快速,并将整个内存管理负担放在内核而不是您的代码上。

      此外,您可能需要考虑如何在内存中表示数据。例如,如果您正在分析基因 AFAIK,则只有四种类型。所以你可以用 2 个比特编码一个基因,或者一个字节编码 4 个基因。这样,您需要做更多的工作来获取/存储基因,但您需要“仅”2.5GB 来存储 100.000 x 100.000 个条目。

      如果您的数据包含大量零,您可能需要阅读 sparse matrices,它可以(取决于输入)显着压缩您的数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 2021-05-29
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 2015-09-06
        相关资源
        最近更新 更多