如何将大规模数据读入内存
小弟有一个问题:假如图中有32*1024个节点,现在要使用迪杰斯特拉算法求最短路径,权重全部是整数,如果使用邻接矩阵存储这些节点,需要相当大的内存,例如,Java中一个整形4byte,则32*1024个节点构成的邻接矩阵需要1G的内存;如果规模变为1024*1024,则需要1T的内存。
因此想要一次性将所有的数据都读入内存显然是不可能的。有没有一种比较好的优化方式来处理这个问题?数据结构的优化,或者是通过分段访问数据来优化?
麻烦大家给一个比较详细的思路。
[解决办法]
建立多级索引,并对数据进行压缩。
[解决办法]
数据既然内存放不下,需要放在硬盘上。由于硬盘IO相对于内存太慢,所以存储在硬盘上的数据需要压缩,读取时解压缩。然后数据要分块存储,例如将矩阵分成M*N的小矩阵(例如32*32,因为4*32*32正好是4KB,一般是一个page大小,磁盘操作是以page为单位的),每次调取某个数据时,先计算属于哪个小矩阵,然后将小矩阵对应的文件读取到内存。
如果数据都达到1T的级别,那就应该考虑分布式算法了。
[解决办法]
最好是排序的数据,找么个数据时,可以先找他属于哪一个部分的索引。