如何使用Python从SQL Query加速插入Redis

时间:2016-01-08 19:33:14

标签: python redis

我执行了一个SQL查询,它进入我的Python程序~500ms(大约100k行)。

我想快速将其插入redis,但它目前需要约6秒,即使有管道。

pipe = r.pipeline()
for row in q:
    pipe.zincrby(SKEY, row["name"], 1)
pipe.execute()

有没有办法加快速度?

2 个答案:

答案 0 :(得分:1)

问题是您在已排序的集合中插入了大量项目。 Redis doc说锌的时间复杂度是O(log(N)),其中N是有序集合中元素的数量。因此,插入的项目越多,所需的时间就越长。在这种情况下,您可能应该重新考虑使用Redis的方式。也许排序的集合不是您用例的最佳答案。

答案 1 :(得分:1)

一般情况下,从redis的角度来看,没有办法加快速度,但是你可以做两件事:

1如果密钥重复,请在调用redis之前通过总结名称来减少行数。即:

d = dict()
for row in q:
   name = row["name"]
   d[name] = d.get(name, 0) + 1

然后如果你有重复的id,你将在redis中减少查询次数。

2另外我会尝试调用execute()每个说1000或5000个命令左右,这样redis在执行时不会阻塞其他调用者,而python本身会分配更少的内存,这可能会加速事情发生了。

e.g。 (结合以上内容):

d = dict()
for row in q:
   name = row["name"]
   d[name] = d.get(name, 0) + 1

pipe = r.pipeline()
for i, (k, v) in enumerate(d.iteritems()):
    pipe.zincrby(SKEY, k, v)
    if i > 0 and i % 5000 == 0:
        pipe.execute()

pipe.execute()