簡體   English   中英

創建和填充表既緩慢又不穩定

[英]Creating and populating a table is slow and unstable

使用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.44s無已填充表ME_Features_20121001 1.48s無

FM_Features_20121001.txt已創建表FM_Features_20121001 67.92s無已填充表FM_Features_20121001 0.22s無

NationalFile_20121001.txt(700mb)表NationalFile_20121001創建了9.34s無表NationalFile_20121001填充了4963.18s無

NJ_Features_20121001.txt已創建表NJ_Features_20121001 1.65s無已填充表NJ_Features_20121001 41.11s無

PW_Features_20121001.txt已創建表PW_Features_20121001 1.73s無已填充表PW_Features_20121001 0.20s無

如何定義timer() 我的盲目猜測(因為您未提供其代碼)是該函數直接調用print來輸出測量的時間,但沒有明確返回任何內容-因此, None打印任何內容。 如果仍然不清楚,請查看以下示例:

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

我不確定您的意思是創建和填充表的時間會有所不同 顯然,填充表所需的時間取決於要插入的數據量。 在每種情況下,創建表所需的時間應大致相同,因此67.92s輸出確實看起來可疑,但是...您確定測量正確嗎?

同樣,我的盲目猜測是timer()打印自上次調用以來的時間。 也許您應該在開始要測量的操作之前明確重置它? 我猜那是花了60秒鍾才調用create_populate_table() ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM