Java PageRank的研究实现
在阅读了PageRank算法的理论之后,我想和它一起玩。 我正试图用Java实现这一点。我的意思是我想详细地使用PageRank(比如给出不同的权重等等)。为此,我需要建立超链接矩阵。如果我有100万个节点,那么我的超链接矩阵的大小将为100万x 100万,这会导致此异常:Java PageRank的研究实现,java,algorithm,graph-algorithm,pagerank,Java,Algorithm,Graph Algorithm,Pagerank,在阅读了PageRank算法的理论之后,我想和它一起玩。 我正试图用Java实现这一点。我的意思是我想详细地使用PageRank(比如给出不同的权重等等)。为此,我需要建立超链接矩阵。如果我有100万个节点,那么我的超链接矩阵的大小将为100万x 100万,这会导致此异常: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at WebGraph.main(WebGraph.java:6) 如何
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at WebGraph.main(WebGraph.java:6)
如何在Java中实现PageRank,有没有存储超链接矩阵的方法 Python
networkx
模块有一个很好的pagerank实现。它使用scipy/numpy实现矩阵。下面关于stackoverflow的两个问题应该足以让您开始学习
-Xmx
。假设您将Java代码编译成一个名为pagerank.JAR
的可运行JAR文件,并且希望将堆大小设置为512 MB,您将发出以下命令:
java -jar -Xmx512m pagerank.jar
编辑:
但这只有在你没有那么多“页面”的情况下才有效。。。100万x 100万阵列太大,无法装入RAM(1万亿次*64位双倍值=7.27595761 TB)。您应该更改算法,从磁盘加载数据块,对其进行操作,然后将其存储回磁盘
您可以使用类似的图形数据库来实现此目的。PageRank由Google使用“Pregel”BSP(实际上只是关键字)框架执行 我记得(另一个Pregel),它在其基准包中包含了一个版本的PageRank :这是一个介绍,它专门讨论如何处理PageRank 如果这不起作用: 在Java中,有一个名为Pregel的实现 PageRank算法的伪代码是(在Pregel的不同实现上)
您必须阅读BSP和PageRank来处理数据的大小。您不必存储整个1000000000矩阵,因为大多数矩阵条目都是零。相反,您可以(例如)为每行存储一个非零项列表,并编写矩阵函数直接使用它,而无需将其扩展为完整矩阵 这种压缩表示形式称为格式,大多数矩阵库都可以选择构建和使用稀疏矩阵 稀疏矩阵的一个缺点是,将其中的两个矩阵相乘将导致矩阵稀疏性大大降低。但是,PageRank算法的设计不需要这样做:超链接矩阵是常量,只更新分数向量。一些建议:
- 使用python,而不是Java:python是一种优秀的原型语言,它有可用的稀疏矩阵(在scipy中)以及许多其他优点。正如其他人所指出的,它还具有pagerank实现
- 不要将数据全部存储在内存中:任何类型的轻量级数据库都可以,例如sqlite、hibernate等等
- 处理数据块:若有一个大的矩阵NxN,将它分解成小的矩阵MxM,其中M是N的一小部分,适合内存。与稀疏矩阵相结合,这允许您使用真正的大N(数亿到数十亿,取决于数据的稀疏程度)
1, 0, 0
0, 0, 2,
0, 3, 0
二维散列映射只存储hm(0,0)=1、hm(1,2)=2和hm(2,1)=3的值。所以,在a的1000000×1000000矩阵中,我预计只有几百万个值是非零的。如果每行仅平均5个非零值,则哈希映射将使用大约5*(8+8+8)*10^6字节~115mb来存储它(8表示左整数索引,8表示右整数索引,8表示双精度值)。方阵将使用8*10^6*10^6~7 TB
在Java中实现一个高效的稀疏矩阵向量乘法不是一件小事,如果您不想花时间在算法的这方面,已经有一些了。稀疏矩阵乘法是pagerank算法最难实现的方面,因此在这之后它变得更容易(也更有趣)。您已经在哪里看过了?你有没有发现任何非开源的实现?您是否考虑过自己实施它?“你对语言有什么偏好吗?”答:我看过荣格和韦布拉。我想把重点放在理论上,而不是实施上。语言偏好:任何。你试过增加堆大小来摆脱那个异常吗?@丹文,我怎么能做到?你需要一个存储稀疏矩阵的库,Matlab有这样一个库(C++中我相信),你可以借用,我相信,并把它链接到你的java代码中。增加堆大小只是一个包袱解决方案,除非处理小型图/矩阵。也许在java中使用这个,我有WebGraph.class,所以我运行了:java-xmx2048mwebgraph,但它仍然提供OutOfMemoryError@tora