Database Reference
In-Depth Information
$redis.set(isbn, title.strip)
# Setzen Sie ein LIMIT, wenn nicht alle Daten eingefügt werden sollen
break if
count >= LIMIT
end
puts
"
#{count}
items in
#{Time.now - start}
seconds"
$
ruby isbn.rb isbn.tsv
2456384 items in 266.690189 seconds
Wenn Sie das Einfügen beschleunigen wollen und nicht mit JRuby arbei-
ten, können Sie optional das
hiredis
-Gem installieren. Dieser C-Treiber ist
wesentlich schneller als der native Ruby-Treiber. Entfernen Sie den Kom-
mentar in der
hiredis require
-Zeile, damit der Treiber geladen wird. Bei
dieser CPU-gebundenen Operation werden Sie vielleicht keine große Verbes-
serung sehen, doch wir empfehlen
hiredis
wärmstens für den produktiven
Ruby-Einsatz.
Eine große Verbesserung werden Sie beim Pipelining sehen. Nachfolgend ver-
arbeiten wir jeweils 1000 Zeilen und fügen sie dann über eine Pipeline ein.
Das hat unsere Einfügezeit um über 300 Prozent reduziert.
redis/isbn_pipelined.rb
BATCH
_
SIZE = 1000
LIMIT = 1.0 / 0
# 1.0/0 ist bei Ruby Unendlich
# %w{rubygems hiredis redis/connection/hiredis}.each{|r| require r}
%w
{rubygems time redis}
.each{|r| require r}
$redis = Redis.new(:host =>
"127.0.0.1"
, :port => 6379)
$redis.flushall
# Daten in einem einzigen Batch-Update einfügen
def
flush(batch)
$redis.pipelined
do
batch.each
do
|saved
_
line|
isbn,
_
,
_
, title = line.split(
"
\t
"
)
next if
isbn.empty? || title ==
"
\n
"
$redis.set(isbn, title.strip)
end
end
batch.clear
end
batch = []
count, start = 0, Time.now
File.open(ARGV[0]).each
do
|line|
count += 1
next if
count == 1
# Zeilen in Array schieben
batch << line
# Schreiben, wenn Array auf BATCH
_
SIZE anwächst