Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PageRank的研究实现_Java_Algorithm_Graph Algorithm_Pagerank - Fatal编程技术网

Java PageRank的研究实现

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) 如何

在阅读了PageRank算法的理论之后,我想和它一起玩。 我正试图用Java实现这一点。我的意思是我想详细地使用PageRank(比如给出不同的权重等等)。为此,我需要建立超链接矩阵。如果我有100万个节点,那么我的超链接矩阵的大小将为100万x 100万,这会导致此异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at WebGraph.main(WebGraph.java:6)

如何在Java中实现PageRank,有没有存储超链接矩阵的方法

Python
networkx
模块有一个很好的pagerank实现。它使用scipy/numpy实现矩阵。下面关于stackoverflow的两个问题应该足以让您开始学习


根据Dan W的建议,尝试增加堆大小。如果从命令行运行Java应用程序,只需添加具有所需堆大小的开关
-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(数亿到数十亿,取决于数据的稀疏程度)


因为矩阵是稀疏的,所以您可以实现降维,如svd、pca、mds或包含svd的Lsi。有一个库来实现这种过程,称为Jama。您可以找到这篇

,这是一篇了解pagerank的好文章。我从中实现了一个Perl版本,用于。但是,如果您只想了解pagerank以及本文中讨论的各个方面如何影响结果(阻尼因子、直接或无向图等),我建议您在或中运行实验。如果您想学习如何有效地实现它,那么像您现在这样从头开始编程是最好的

大多数web图(或网络)都非常复杂,这意味着图的矩阵表示中的大多数条目都是零。用于表示稀疏矩阵的常见数据结构是,其中不存储零值。例如,如果矩阵是

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