我想使用一個相當大的語料庫。它以Web 1T-gram的名字命名。它有大約3萬億令牌。這是我第一次使用redis,我試圖編寫所有的關鍵值對,但其耗時太長。我的最終目標是使用多個redis實例來存儲語料庫,但現在,我堅持將它們全部寫入單個實例。寫入3,795,790,711唯一鍵:值對redis
我不確定,但有什麼方法可以加快寫作過程嗎?截至目前,我只在一臺裝有64G內存的機器上寫入一個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 '
UPDATE:
我也讀到了大量插入,並一直在努力做到這一點,但是,保持迷失方向。這裏是腳本的變化:
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'
這正好和。輸入形式爲
「string」\ t count。
謝謝。
月2日更新:
我用流水線,但這並給我一個提升。但是很快它就耗盡了內存。作爲參考,我有一個64G 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場演出就足夠了。我只給了它20億個關鍵值對的一小部分,而不是全部。
哦,我的。 Redis僅支持43億個密鑰。你的意思是30億? –
實際上,redis常見問題狀態'[redis]在實踐中已經過測試,每個實例至少需要處理2.5億個密鑰,所以這很可怕。 –
您是否閱讀過[本文檔](http://redis.io/topics/mass-insert)? –