带大对象的Memcached(NetworkX图形)

2024-04-25 14:12:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个NetworkX图(g),有~25k个节点和125k条边。我想用memcached缓存g,但是g太大了。我最多能将每个项目的memcached限制提高到32MB,这是行不通的。你知道吗

  1. 我应该试着让它和memcached一起工作吗?

  2. 如果我想存储一个networkx图形,它最多可以有1米的节点和10米的边,那么我的其他选择是什么?

  3. 我该如何将图分块以使其变小,而不需要(a)了解任何有关图的信息,以及(b)以一种会导致最小性能下降的方式将这些分块放回一起。

我在用python。创建图形的示例代码附在后面。你知道吗

import sys
import pickle
import random
import networkx as nx
from django.core.cache import cache

def randstring(x=3):
    return ''.join([chr(random.randrange(65, 91)) for _ in range(x)])

class Qux(object):
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

for n, v in {1: 500, 2: 5000, 3: 50000}.items():
    g = nx.Graph()
    nodes = [Qux(randstring(), randstring()) for _ in range(v)]
    g.add_nodes_from(nodes)
    for node in g.nodes:
        num = random.randrange(25)
        edges = [(node, random.choice(nodes)) for _ in range(num)]
        g.add_edges_from(edges)

    print len(g.nodes), sys.getsizeof(pickle.dumps(g))
    cache.set('{}/graph'.format(n), g, 3600)

Memcached控制台输出(memcached -I 32M -vv

<20 new auto-negotiating client connection
20: Client using the ascii protocol
<20 set :1:1/graph 1 3600 130678 
>20 STORED
<20 delete :1:2/graph
>20 NOT_FOUND
<20 delete :1:3/graph
>20 NOT_FOUND

Tags: infromimportselfcacheforfoobar
1条回答
网友
1楼 · 发布于 2024-04-25 14:12:29

如果您查看NetworkX的代码,这些图只不过是python dict。如果您需要的唯一功能是访问节点和边,那么使用dicts构建图形并将文件转换为JSON可以允许您缓存图形。 将边添加到无向加权图的代码基本上如下所示:

G_New = {}
for edge in edges:
    try:
        G_New[edge['node1'].update({edge['node2']: edge['weight']})
    except KeyError:
        G_New[edge['node1']] = {edge['node2']: edge['weight']}
    try:
        G_New[edge['node2']].update({edge['node1']: edge['weight']})
    except KeyError:
        G_New[edge['node2']] = {edge['node1']: edge['weight']}

之后就是一个简单的json.dumps(G_New)。对于较大的图形,您可以将dict拆分为较小的组件,并将每个组件托管在memcache上。因此How to split dictionary into multiple dictionaries fast

相关问题 更多 >