2017-09-24 51 views
0

我使用Python 2.7版与大熊猫0.20.2读取多个CSV文件到一个数据帧(一次一个),在DF内选定系列创建列表,然后转储信息导入到MySQL数据库中。好奇的行为是,第一个循环工作正常(尝试各种文件,并且第一个总是正常工作),但随后的写入MySQL挂起时存在大量内存泄漏,直到出现segmentation fault (core dumped)错误。的Python 2.7 /熊猫/ MySQL的分段错误

我将在这里给出一个小例子:

import pandas as pd 
import MySQLdb 

file_list = ['file1.csv','file2.csv'] 

db = MySQLdb.connect(...) 

with db as c: 
    c.execute("USE my_db") 

    for f in file_list: 
     df = pd.read_csv(f, parse_dates = ['date_time']) 

     sql_dict = { 
        'date_time': df['date_time'].dt.strftime('%Y-%m-%d %H:%M:%S').tolist(), 
        'num':df['num'].tolist() 
        } 

     columns = sql_dict.keys() 
     values = sql_dict.values() 

     join_string = "(" + ",".join("%s" for c in columns) + ")" 
     query = "REPLACE INTO std_ints ({}) VALUES ".format(", ".join(columns)) + ",".join(join_string for _ in values[0]) 
     flat_vals = [ i for s in zip(*values) for i in s ] 

     c.execute(query, flat_vals) 
     db.commit() 

db.close() 

第一个循环执行完美,然后通过第二循环,直到c.execute(query, flat_vals)线在那里挂运行,永远不会完成。

我试过一百万次各种迭代的.commit(),关闭或不关闭db,都无济于事。

我不能说这是否是一个错误的熊猫或MySQL错误,但dataframes既快速生成并采取了完全相同的内存空间,所以我想这是一个MySQL的问题。

我也读了this thread regarding multithreading,并在file_list中包含了每个循环的新连接,也无济于事。

任何帮助,将不胜感激。

+0

如何安装MySQL驱动程序?另外,请检查客户端库版本是否与服务器版本匹配。有时'pip uninstall'和'pip install'会再次提供帮助,因为它会重建二进制文件并正确链接到MySQL客户端库。 – tungd

+0

@ tungd - 感谢您的建议,如果没有其他的工作,我会给它一个镜头。鉴于我可以使用各种数据集将数据插入数据库,我倾向于认为这不是原因......但我很容易被误解。 – pshep123

回答

0

尽管我关于“关于多线程的这个主题”的一句话,我认为这可能会得到答案。

新,工作代码:

import pandas as pd 
import MySQLdb 

file_list = ['file1.csv','file2.csv'] 

for f in file_list: 
    db = MySQLdb.connect(...) 

    with db as c: 
     c.execute("USE my_db") 

     df = pd.read_csv(f, parse_dates = ['date_time']) 

     sql_dict = { 
        'date_time': df['date_time'].dt.strftime('%Y-%m-%d %H:%M:%S').tolist(), 
        'num':df['num'].tolist() 
        } 

     columns = sql_dict.keys() 
     values = sql_dict.values() 

     join_string = "(" + ",".join("%s" for c in columns) + ")" 
     query = "REPLACE INTO std_ints ({}) VALUES ".format(", ".join(columns)) + ",".join(join_string for _ in values[0]) 
     flat_vals = [ i for s in zip(*values) for i in s ] 

     c.execute(query, flat_vals) 
     db.commit() 

注意,在更新的版本缺乏db.close()。坦率地说,我不确定关键是什么,但是无论是和/或重新排序的MySQL连接调用都有诀窍。