かなり大きなコーパスで作業したい。これは、web 1T-gram の名前で呼ばれます。約3兆のトークンがあります。redis を使用するのはこれが初めてで、すべてのキーと値のペアを書き込もうとしていますが、時間がかかりすぎます。私の最終目標は、複数の 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 カウント .
ありがとう。
2回目の更新:
私はパイプラインを使用しましたが、それは私を後押ししました。しかし、すぐにメモリが不足しました。参考までに、64ギガの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 億個のキーと値のペアの小さなサブセットのみを指定し、すべてを指定したわけではありません。