2016-09-30 14 views
2

私は特定のデータベースにデータをロードするプログラムを書いています。これは私がCOPYコマンドの使用についてのthis質問について承知しています...私が今やっている何postgresの速度向上INSERTコマンド

 conn = psycopg2.connect("dbname='%s' user='postgres' host='localhost'"%dbName) 
     cur = conn.cursor() 

     lRows = len(rows) 
     i, iN = 0, 1000 
     while True: 

      if iN >= lRows: 
       # write the last of the data, and break ... 
       iN = lRows 
       values = [dict(zip(header, r)) for r in rows[i:iN]] 
       cur.executemany(insertString, values) 
       conn.commit() 
       break 

      values = [dict(zip(header, r)) for r in rows[i:iN]] 
      cur.executemany(insertString, values) 
      conn.commit() 

      i += 1000 
      iN += 1000 

     cur.close() 
     conn.close() 

です。しかし、ファイルをデータベースにアップロードする前に、私は自分のファイルにいくつかの簿記をする必要があります。したがって私はこの方法でPythonを使用しています。

私は物事を高速化する方法についての質問のカップルを持っている...

  1. はそれが最後で、多くのcur.executemany()文や単一conn.commit()を行う方が良い(または可能)でしょうか?これは、cur.close()の文の直前にという単一のconn.commit()の文を挿入することを意味します。
  2. 私はいつも他の人が1000のようなレコードのバッチに対してcur.executemany()を使用するのを見てきました。これは一般的なケースであるか、ファイルから読み取ったレコード全体に対してcur.executemany()を実行するだけですか?私は潜在的に何十万ものレコード、あるいはおそらく100万レコード以上のレコードを持っています。 (私はメモリにファイル全体を収めるのに十分なRAMを持っています)。一度にアップロードできるレコード数の上限を知るにはどうしたらいいですか?
  3. 私は開いているファイルごとにデータベースに新しく接続しています。私はこれをやっています。なぜなら、このプロセスは完了まで何日もかかるためです。いつでも接続が失われても、データ全体を破壊する接続に関する問題はありません。何千ものファイルがあります。私たちが行っている数千のつながりは、そのプロセスに使われる時間の重要な部分になるでしょうか?
  4. 私がやってはならないプログラムでやっていることは、プロセスの合計時間を短縮することができますか?

私が得ることができるどんな助けでもありがとう。質問がとても基本的であることは申し訳ありません。私はちょうどPythonのデータベースを使い始めていますが、何らかの理由で、私はこれらの質問のどれにも決定的な答えを得ていないようです。

答えて

1
  1. あなたが唯一のすべての挿入後に1 conn.commit()を使用している場合、あなたは簡単に緩んですでに挿入することができますが、あなたの接続ならば、データをコミットしていないので、あなたは、壊れる可能性があるデータベース接続、心配しているP.3で述べたようにconn.commit()の前に壊れます。各cur.executemany()の後にconn.commit()を実行すると、最後のバッチのみがすべて緩められません。したがって、それはあなた次第であり、サポートする必要があるワークフローに依存します。

  2. バッチあたりのレコード数は、挿入速度と他のもののトレードオフです。要件を満たす値を選択する必要がある場合は、バッチごとに1,000レコードでスクリプトをテストし、バッチごとに10000を使用して差異を確認できます。 cur.executemany()の中にファイル全体を挿入する場合には、アトミック性の利点があります。実行された場合、この特定のファイルからのすべてのレコードが挿入されたことを意味します。 1.

  3. 私はあなたのケースで新しい接続を確立するコストは本当に問題ではないと思います。たとえば、新しい接続を確立するために1秒かかる場合、1000のファイルを使用すると、数日以内に1000秒の接続に費やされます。

  4. プログラム自体は正常に見えるが、私はまだあなたが、それは本当にあなたの輸入をスピードアップしますUNLOGGEDまたはTEMPORARYテーブルでCOPY TOコマンドの表情を取ることをお勧めします。

関連する問題