Python 加载批量数据的正确方法

Python 加载批量数据的正确方法,python,libmemcached,memcachedb,Python,Libmemcached,Memcachedb,我试图将大量数据加载到memcachedb中。 我正在MySQL数据库上运行一些查询,我想将这些查询的结果存储在memcachedb中,以便以后轻松访问 目前,我只是使用简单的set命令将结果存储在memcachedb中,但由于有数十亿个这样的结果,在循环中逐个存储它们是非常低效和耗时的。所以,我想知道是否有更好的方法将数据加载到memcachedb中?就像传统RDMS中的数据导入向导一样 我正在使用pylibmc连接到memcachedb。pylibmc库有一个函数,它一次发送一系列命令: m

我试图将大量数据加载到memcachedb中。 我正在MySQL数据库上运行一些查询,我想将这些查询的结果存储在memcachedb中,以便以后轻松访问

目前,我只是使用简单的set命令将结果存储在memcachedb中,但由于有数十亿个这样的结果,在循环中逐个存储它们是非常低效和耗时的。所以,我想知道是否有更好的方法将数据加载到memcachedb中?就像传统RDMS中的数据导入向导一样


我正在使用pylibmc连接到memcachedb。

pylibmc库有一个函数,它一次发送一系列命令:

mc.set_multi({
    'key': 'Hello',
    'another': True,
    #[..]
})
这应该足够有效了。如果你有几十亿把钥匙,你可能想把它分成几千块

如果您只是通过套接字发送命令,可能会提高性能。这个 这很简单。这样做的好处是,您可以添加
noreply
标志,这样服务器就不用麻烦发送回复了。当然,这意味着您不能进行任何错误检查,无论出于何种原因丢失一些密钥都可以

以下是一个简单的概念证明:

#!/usr/bin/env python

import socket

data = 'set key_1 0 86400 5\r\nabcde\r\n'
data += 'set key_2 0 86400 5\r\nzxcvb\r\n'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 11211))
s.sendall(data)
print(s.recv(8192))
s.close()

# Verify if it worked!
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 11211))
s.sendall('get key_1\r\n')
s.sendall('get key_2\r\n')
print(s.recv(8192))
s.close()
应输出:

STORED
STORED

VALUE key_1 0 5
abcde
END
VALUE key_2 0 5
zxcvb
END
set
命令的格式为:

set <key> <flags> <exptime> <data_size> [noreply]\r\n
<data>\r\n

如果你从MySQL获取数据,那么考虑使用SQL查询来制作<代码> SET>代码>命令!例如:

select
    concat('set key_', page_id, ' 0 86400 ', length(page_title), '\r\n', page_title, '\r\n')
    as cmd
from page limit 2;

不确定这是否真的更快,但我怀疑是这样。

是的,我找到了multi_set函数,它比单个set更有效,但我一直在寻找一种更像memcachedb(数据库)的批量导入功能。我现在正在使用multi_set。@Wajahat我不知道“批量导入功能”是什么意思?如果您正在寻找一个
从\u mysql\u高效()导入\u my\u四十亿个\u keys\u的函数,那么这个函数实际上并不存在,但是您可以像上面所述的那样轻松地自己构建一个。。。
select
    concat('set key_', page_id, ' 0 86400 ', length(page_title), '\r\n', page_title, '\r\n')
    as cmd
from page limit 2;