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