我想使用一个相当大的语料库。它的名称为 web 1T-gram。它有大约 3 万亿个代币。这是我第一次使用 redis,我正在尝试编写所有 key:value 对,但它花费的时间太长。我的最终目标是使用几个 redis 实例来存储语料库,但是,目前,我坚持将其全部写在一个实例上。
我不确定,但有什么方法可以加快写作过程吗?截至目前,我只在具有 64G RAM 的机器上编写单个 redis 实例。我在想是否有一些缓存大小设置可以最大化用于redis。或者那些线上的东西?
谢谢。
作为参考,我编写了以下代码:
import gzip
import redis
import sys
import os
import time
import gzip
r = redis.StrictRedis(host='localhost',port=6379,db=0)
startTime = time.time()
for l in os.listdir(sys.argv[1]):
infile = gzip.open(os.path.join(sys.argv[1],l),'rb')
print l
for line in infile:
parts = line.split('\t')
#print parts[0],' ',parts[1]
r.set(parts[0],int(parts[1].rstrip('\n')))
r.bgsave()
print time.time() - startTime, ' seconds '
更新 :
我阅读了有关大规模插入的信息,并一直在尝试这样做,但也一直失败。这是脚本的更改:
def gen_redis_proto(*args):
proto = ''
proto += '*' + str(len(args)) + '\r\n'
for arg in args:
proto += '$' + str(len(arg)) + '\r\n'
proto += str(arg) + '\r\n'
return proto
import sys
import os
import gzip
outputFile = open(sys.argv[2],'w')
for l in os.listdir(sys.argv[1]):
infile = gzip.open(os.path.join(sys.argv[1],l),'rb')
for line in infile:
parts = line.split('\t')
key = parts[0]
value = parts[1].rstrip('\n')
#outputFile.write(gen_redis_proto('SET',key,value))
print gen_redis_proto('SET',key,value)
infile.close()
print 'done with file ',l
生成方法的功劳归于 github 用户。我没有写。
如果我运行这个,
ERR wrong number of arguments for 'set' command
ERR unknown command '$18'
ERR unknown command 'ESSPrivacyMark'
ERR unknown command '$3'
ERR unknown command '225'
ERR unknown command ' *3'
ERR unknown command '$3'
ERR wrong number of arguments for 'set' command
ERR unknown command '$25'
ERR unknown command 'ESSPrivacyMark'
ERR unknown command '$3'
ERR unknown command '157'
ERR unknown command ' *3'
ERR unknown command '$3'
这种情况一直在继续。输入的形式为
“字符串” \t 计数。
谢谢。
第二次更新:
我使用了流水线,这确实给了我动力。但很快它就耗尽了内存。作为参考,我有一个具有 64 gig RAM 的系统。而且我认为它不会耗尽内存。代码如下:
import redis
import gzip
import os
import sys
r = redis.Redis(host='localhost',port=6379,db=0)
pipe = r.pipeline(transaction=False)
i = 0
MAX = 10000
ignore = ['3gm-0030.gz','3gm-0063.gz','2gm-0008.gz','3gm-0004.gz','3gm-0022.gz','2gm-0019.gz']
for l in os.listdir(sys.argv[1]):
if(l in ignore):
continue
infile = gzip.open(os.path.join(sys.argv[1],l),'rb')
print 'doing it for file ',l
for line in infile:
parts = line.split('\t')
key = parts[0]
value = parts[1].rstrip('\n')
if(i<MAX):
pipe.set(key,value)
i=i+1
else:
pipe.execute()
i=0
pipe.set(key,value)
i=i+1
infile.close()
哈希是要走的路吗?我认为 64 gig 就足够了。我只给了它 20 亿个键值对的一小部分,而不是全部。