0

我正在使用 Graphchi 的 pagerank 示例:https ://github.com/GraphChi/graphchi-cpp/wiki/Example-Apps#pagerank-easy

示例应用程序编写了一个包含顶点信息的二进制文件,我想将其读取/转换为计划文本文件(以便稍后调用 R 或其他语言)。

该文件指出:

“GraphChi 会将边的值写入二进制文件中,这在其他程序中很容易处理。包含顶点值的文件的名称是 GRAPH-NAME.4B.vout。这里的“4B”指的是顶点值一个 4 字节类型(浮点数)。”

“易于处理”的部分是我正在努力解决的问题 - 我有高级语言的经验,但没有 C++ 或处理二进制文件。我通过搜索 stackoverflow 找到了一些东西,但在阅读这个文件时还没有运气。理想情况下,这将通过 bash 或 python 完成。

非常感谢您对此的帮助。

更新:hexdump graph-name.4B.vout | head -5给出:

0000000 999a 3e19 7468 3e7f 7d2a 3e93 d8e0 3ec4 0000010 cec6 3fe4 d551 3f08 eff2 3e54 999a 3e19 0000020 999a 3e19 3690 3e8c 0080 3f38 9ea3 3ef5 0000030 b7d6 3f66 999a 3e19 10e3 3ee1 400c 400d 0000040 a3df 3e7c 999a 3e19 979c 3e91 5230 3f18

4

2 回答 2

1

以下是如何使用 GraphCHi 将输出写为字符串的示例代码: https ://github.com/GraphChi/graphchi-cpp/wiki/Vertex-Aggregators

但是数组是简单的字节数组。以下是如何在 python 中读取它的示例:

import struct
from array import array as binarray 
import sys

inputfile = sys.argv[1]

data = open(inputfile).read()
a = binarray('c')
a.fromstring(data)

s = struct.Struct("f")

l = len(a)

print "%d bytes" %l

n = l / 4

for i in xrange(0, n):
    x = s.unpack_from(a, i * 4)[0]
    print ("%d %f" % (i, x))
于 2015-02-08T21:19:49.187 回答
0

我遇到了同样的麻烦。幸运的是,我与一群帮助我的网络工程师一起工作!在 Mac Linux 上,以下命令用于每个节点打印 4B.vout 数据一行,整数值与摘要文件中给出的相同。如果您的文件被称为例如 filename.4B.vout,那么一些命令行 perl 会为您提供:

cat 文件名.4B.vout | LANG= perl -0777 -e '$,=\"\n\"; 打印解包(\"L*\",<>),\"\";'

编辑添加:这是用于连接组件 ID 和社区 ID 的分配,隐式写入第一行是标记为 0 的节点的 ID,第二行是标记为 1 等的节点。但我在这里复制粘贴,所以我不知道它需要如何改变浮动。它适用于每个节点的整数值。

于 2015-02-09T22:52:15.540 回答