2014-11-05 63 views
0

我有一个Python脚本,它循环访问每个文件夹中的文件夹,并对我们的Redshift群集执行sql文件(使用psycopg2)。下面是做循环中的代码(注意:这只是正常的是只需要几分钟的时间来执行查询):执行长时间运行的查询时,即使查询完成后,Python脚本仍会挂起

for folder in dir_list: 
    #Each query is stored in a folder by group, so we have to go through each folder and then each file in that folder 
    file_list = os.listdir(source_dir_wkly + "\\" + str(folder)) 

    for f in file_list: 
     src_filename = source_dir_wkly + "\\" + str(folder) + "\\" + str(f) 
     dest_filename = dest_dir_wkly + "\\" + os.path.splitext(os.path.basename(src_filename))[0] + ".csv" 
     result = dal.execute_query(src_filename) 
     result.to_csv(path_or_buf=dest_filename,index=False) 

execute_query是存储在另一个文件的方法:

def execute_query(self, source_path): 
    conn_rs = psycopg2.connect(self.conn_string) 
    cursor = conn_rs.cursor(cursor_factory=psycopg2.extras.RealDictCursor) 
    sql_file = self.read_sql_file(source_path) 
    cursor.execute(sql_file) 
    records = cursor.fetchall() 
    conn_rs.commit() 
    return pd.DataFrame(data=records) 

def read_sql_file(self, path): 
    sql_path = path 
    f = open(sql_path, 'r') 
    return f.read() 

我有几个查询需要大约15分钟才能执行(因为我们的Redshift集群中的数据量很大,所以并不常见),并且它们在SQL Workbench中执行得很好。我可以在AWS Console中看到查询已完成,但脚本只是挂起,不会将结果转储到csv文件,也不会继续到文件夹中的下一个文件。

我没有指定任何超时。还有什么我失踪?

+0

我会添加一些调试日志记录到脚本来查看它实际挂起的位置。 – 2014-11-05 16:29:44

回答

0

records = cursor.fetchall()可能是罪魁祸首。它读取所有数据,并将查询中的所有结果加载到内存中。鉴于你的查询非常大,这些数据可能无法全部加载到内存中。

您应该遍历游标的结果并逐个写入您的csv。通常试图一次读取数据库查询中的所有数据不是一个好主意。

您需要重构你的代码这样做:

for record in cursor: 
    csv_fh.write(record) 

csv_fh是一个文件句柄到CSV文件。您使用pd.DataFrame将需要重写,因为它看起来像预计将所有数据传递给它。