28

6月 19

 

巨大なcsvファイルをデータベースに入れるrubyスクリプト

1億2千万行のcsvデータをデータベースに保管したくなったので、rubyを使ってデータベース(Mysql)に挿入した。

gem install mysql

でrubyのmysqlライブラリを入れようとしたら

libmysqlclient-dev を先にaptでインストールするべしとのお告げを得たので

sudo apt install libmysqlclient-dev

でまずはlibmysqlclient-devをインストール

その後

gem install mysql

で無事gemが入った

以下mysqlDBにファイルからデータをINSERTするのに使ったコードです。

#!/usr/bin/ruby

require 'mysql'

client = Mysql::new("127.0.0.1", "username", "password", "db-name")

# set charcter code UTF-8
client.query("set character set utf8")

File.open('./source.csv', 'r') do |f|
    f.each_slice(1000) do |chunk|
        chunk.each do |lines|
			# chop() cuts "\n" end of line
            buf = lines.chop.split(',')
            client.query("INSERT INTO test(time,price,amount) VALUES(#{buf[0]},#{buf[1]},#{buf[2]});")
        end
    end
end

client.close

io.each_slice(1000)

普通のeachを使うと一行ずつの処理になってしまい、時間もかかるものと思われるが、each_slice(n)によってnの数分だけ一気に処理を行うことができる。

nの数は各々のメモリ搭載量に合わせて変更していただければと思います。

ただ想定外だったのは、これでも一万件のレコードを挿入するのにおよそ1分くらいかかってしまうこと

単純に計算して1億2千万件のレコードを挿入し終えるのは166時間以上の時間が必要ということになる…

NOSQLデータベースだったらもっと早いんだろうね。

そのうちそっち方面も探っていきたい




No comments yet, be the first.

コメントを残す