PostgreSQL で,ランダムデータのテーブルを作る

約 500M バイトのCSVファイルを生成し,PostgreSQLのデータベースにインポートする方法について説明する.

前準備

PostgreSQLのインストール

ランダムデータ(CSV形式)の準備

  1. ランダムデータ(CSV形式)の生成プログラム

    ランダムデータ(CSV形式)の生成プログラムの詳細は,別ページ »を参照

  2. ランダムデータ(CSV形式)の準備

    以下のコマンドにより,約 500M バイトのランダムデータ(CSV形式)を生成する

    ./populate.out 7300000 > 500m.csv

postgresql.confの設定

設定ファイルは,「sudo find -name "postgresql.conf" -print」コマンドで検索できる.

  1. 以下の設定パラメータを調整する.
    shared_buffers = 1GB
    work_mem = 1GB
    max_files_per_process = 1000
    effective_cache_size = 4GB

    個人利用環境では,オンライントランザクション処理が不要な場合,WAL機能を実質的に無効化して運用することができる.

    wal_level = minimal
    archive_mode = off
    max_wal_senders = 0
  2. 設定ファイルの変更を反映するため,PostgreSQLサーバを再起動する

    エラーメッセージが表示されなければ正常に動作している.

    sudo pg_ctlcluster 14 main restart
    sudo pg_ctlcluster 14 main status

CSVファイルのインポート

  1. 性能測定を行う場合は,データベースキャッシュのクリア,新規データベースの作成,データベースのvacuumを実行する.

    以下のコマンドを順次実行する.

    sudo pg_ctlcluster 14 main stop
    sudo sync
    sudo sync
    sudo sync
    sudo sync
    sudo sync
    sudo sysctl -w vm.drop_caches=3
    sudo pg_ctlcluster 14 main start
    sudo pg_ctlcluster 14 main status
    echo "drop database if exists testdb;" | sudo -u postgres psql
    echo "create database testdb;" | sudo -u postgres psql
    echo "vacuum full;" | sudo -u postgres psql -d testdb
  2. テーブルの定義,CSVファイルのインポート,データ確認を実施する.

    「select count(*) from T500m;」を実行してレコード数を確認し,dateコマンドで処理時間を計測する.

    echo "create table T500m(num integer, name text, lat real, lon real, at timestamp);" | sudo -u postgres psql -d testdb
    date +%H:%M:%S.%3N
    echo "\copy T500m from '500m.csv' delimiter ','" | sudo -u postgres psql -d testdb
    date +%H:%M:%S.%3N
    echo "select count(*) from T500m;" | sudo -u postgres psql -d testdb