我有一个巨大的100,000x100,000
矩阵(txt文件),用于计算遗传算法中染色体的适应度。我的人口规模是100,世代大小是1000.所以我正在读这个文件100,000次。
GA是用C
编写的,我不熟悉C
。在C
中读取此矩阵文件的有效方法是什么?有没有其他方法可以优化这个。
谢谢。
Edit:
对不起,它是一个100,000 X 100,000的矩阵文件。我无法将其保留在内存中,因为它需要大约37GB。我想在每次需要时阅读。
答案 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,这可能会根据输入显着压缩您的数据。