2017-09-24 3 views
0

複数のCSVファイルを(一度に1つずつ)読み込み、DF内で選択したシリーズからリストを作成し、それをダンプするには、pandas 0.20.2のpython 2.7を使用しています情報をMySQLデータベースに格納します。Python 2.7/Pandas/MySQLセグメンテーションフォールト

最初のループがうまく動作し(さまざまなファイルを試したが、最初のものは常にうまくいく)、後でMySQLへの書き込みは、segmentation fault (core dumped)エラーが発生するまで大きなメモリリークでハングします。

私はここで、最小限の例をあげてみます:

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)ラインまで、第2ループを実行し、完了することはありません。

私は.commit()の百万回のさまざまな反復を試みましたが、閉鎖するか閉鎖するかはdbでした。

これはパンダエラーかMySQLエラーかはわかりませんが、データフレームはすぐに生成され、メモリ内の同じ正確なスペースを占めるので、MySQLの問題だと思っています。

また、this thread regarding multithreadingを読んで、file_listの各ループに新しい接続を含めても、役に立たない。

ご協力いただければ幸いです。

+0

どのようにMySQLドライバをインストールしますか?また、クライアントライブラリのバージョンがサーバーのバージョンと一致していることを確認します。 'pip uninstall'と' pip install'は、バイナリを再構築し、MySQLクライアントライブラリへのリンクを正しく再現するので、時には 'pip uninstall'と' pip install'を助けます。 – 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接続コールの再注文や再注文のいずれかがトリックでした。

関連する問題