0

テーブルの作成/入力に使用csv_copyすると、非常に遅い場合があることに気付きました。以下は、コア コードといくつかのサンプル出力です。

2 つの質問があります。

  1. テーブルの作成と入力に時間がかかる理由がわかりません。
  2. 「なし」が印刷された原因がわかりません。

コード:

def create_populate_table(table_name,fields,types,cur):
    sql = 'CREATE TABLE IF NOT EXISTS ' + table_name + ' (\n'
    for i in xrange(len(fields)):
        if i==0:
            sql += fields[i]+' '+types[i]+' NOT NULL PRIMARY KEY,\n'
        elif i==len(fields)-1:
            sql += fields[i]+' '+types[i]+')'
        else:
            sql += fields[i]+' '+types[i]+',\n'
    #print sql
    cur.execute(sql)
    conn.commit()
    print "Table ",table_name," created ",timer()

    cur.execute("SELECT count(*) from "+table_name)
    if cur.fetchone()[0]>0:
        return
    # populate data into created table
    fr= open(file, 'r')
    fr.readline()
    # parse and convert data into unicode
    #data = unicode_csv_reader(fr, delimiter='|')
    # anything can be used as a file if it has .read() and .readline() methods
    data = StringIO.StringIO()
    s=''.join(fr.readlines())
    while(s.find('\r\n')<>-1):
        s=s.replace('\r\n','\n')
    #timer()
    while(s.find('||')<>-1 or s.find('|\n')<>-1 ):
        s=s.replace('||','|0|')
        s=s.replace('|\n','|0\n')
    #timer()
    #print s.split('\t')[:2]
    #exit(0)
    data.write(s)
    data.seek(0)
    try:
        cur.copy_from(data, table_name,sep='|')
        conn.commit()
        print "Table ",table_name," populated ",timer()
    except psycopg2.DatabaseError, e:
        if conn:
            conn.rollback()
        print 'Error %s' % e    
    fr.close()  

私が見る出力:

ME_Features_20121001.txt テーブル ME_Features_20121001 の作成 1.44 秒 なし テーブル ME_Features_20121001 の入力 1.48 秒 なし

FM_Features_20121001.txt テーブル FM_Features_20121001 が作成されました 67.92 秒 なし テーブル FM_Features_20121001 が入力されました 0.22 秒 なし

NationalFile_20121001.txt (700mb) Table NationalFile_20121001 作成 9.34s なし Table NationalFile_20121001 作成 4963.18s なし

NJ_Features_20121001.txt テーブル NJ_Features_20121001 が作成された 1.65 秒 なし テーブル NJ_Features_20121001 が入力された 41.11 秒 なし

PW_Features_20121001.txt テーブル PW_Features_20121001 が作成された 1.73 秒 なし テーブル PW_Features_20121001 が入力された 0.20 秒 なし

4

1 に答える 1

1

はどのようにtimer()定義されていますか? 私の盲目的な推測 (コードを提供しなかったため) は、この関数はprint測定された時間を出力するために直接呼び出しますが、明示的に何も返さないため、出力Noneされます。それでも不明な場合は、次の例を見てください。

>>> def test():
...     print 'test'
... 
>>> print 'This is a', test()
This is a test
None

テーブルの作成と作成の時間が異なると言っている意味がわかりません。テーブルにデータを入力するのに必要な時間は、明らかに、挿入するデータの量によって異なります。テーブルを作成するのに必要な時間は、それぞれの場合で多かれ少なかれ同じであるため、67.92s出力は確かに疑わしいように見えますが...正しく測定されていますか?

繰り返しますが、私の盲目的な推測ではtimer()、最後の呼び出しからの時間が出力されます。おそらく、測定したい操作を開始する前に、明示的にリセットする必要がありますか? 電話をかける前にその60秒が費やされたと思いcreate_populate_table()ます...

于 2012-11-06T19:25:39.913 に答える