用C读取一个巨大的矩阵文件

时间:2012-01-20 17:54:44

标签: c file optimization file-io matrix

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

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

谢谢。

Edit:

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

4 个答案:

答案 0 :(得分:4)

了解mmap(),这对大型文件非常有用。

答案 1 :(得分:2)

您对矩阵中的数据了解多少?数据是否大多为零,因此矩阵为sparse?如果是这种情况,那么只需要存储非零元素。 Here是稀疏矩阵操作的示例C库。

矩阵中是否有symmetry?例如,如果它具有对角线对称性,则只需要存储一半数据。

编辑添加:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

如果您的数据包含大量零,则可能需要阅读sparse matrices,这可能会根据输入显着压缩您的数据。