Linux

巨大な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するのに使ったコードです。

[ruby]
#!/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

[/ruby]

io.each_slice(1000)

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

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

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

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

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

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

midnight-commanderのオプションの開き方前のページ

neovimがエラーを吐いたときにやったこと次のページ

関連記事

  1. Linux

    sambaで接続したストレージにcronを使ってファイルを保存しようとすると動かないわけ

    いやー、久しぶりにかなりハマりました。sambaを介してLinuxと…

  2. awk

    awkを使って一行の中の複数の要素をマッチさせる方法

    今年の末にyahooブログがサービスを終了するにともなって、そのブログ…

  3. bash

    soracom SIMで通信中のラズパイにSSHで接続する

    最近はラズベリーパイをつかってIoTデバイスを作ろうという試みをやって…

  4. Linux

    [linux] でSSHを用いて他ホストに接続する設定をファイルに保存する方法。ブックマーク的な。

    LinuxでSSHを用いて他のホストに接続することは割とよく行うことだ…

  5. bash

    Linuxで複数のファイルの末尾にワンライナーで文字列を追記する方法

    たとえばあるディレクトリの中にtext1.txt,text2.tx…

  6. Linux

    VirtualBoxでゲストOSのシステム時間を狙った日付に変更する方法

    先日、VirtualBoxの中で使っているWindowsの時間を巻き戻…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

PAGE TOP