0

csv_copy用于创建/填充表时,我注意到它有时非常慢。以下是核心代码和一些示例输出。

我有两个问题:

  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) 表 NationalFile_20121001 创建 9.34 秒 无 表 NationalFile_20121001 填充 4963.18 秒 无

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 回答