読み込み - python 大量データ




Pandas の大規模で永続的なDataFrame (4)

私は長年のSASユーザとしてPythonとpandasへの移行を模索しています。

しかし、今日いくつかのテストを実行すると、 pandas.read_csv()に128MBのcsvファイルをpandas.read_csv()しようとすると、pythonのメモリ不足に驚いていました。 ほとんどの数値データは約200,000行と200列でした。

SASでは、csvファイルをSASデータセットにインポートすることができ、ハードドライブと同じ大きさにすることができます。

pandas類似したものはありpandasか?

私は定期的に大きなファイルを扱い、分散コンピューティングネットワークにアクセスすることはできません。


あなたはpandas dfではなくPytableを使うことができます。 大きなデータセット用に設計されており、ファイル形式はhdf5になっています。 したがって、処理時間は比較的高速です。


これは古いスレッドですが、ここでは解決策の解決策をダンプしたかっただけです。 私は最初にchunksizeパラメータを試しましたが(10000のような非常に小さい値でも)、それはあまり役に立たなかった。 私のCSVは〜7.5Gbでした。

今は、forループアプローチでCSVファイルのチャンクを読み込んで、SQLiteデータベースにステップバイステップで追加するだけです。

import pandas as pd
import sqlite3
from pandas.io import sql
import subprocess

# In and output file paths
in_csv = '../data/my_large.csv'
out_sqlite = '../data/my.sqlite'

table_name = 'my_table' # name for the SQLite database table
chunksize = 100000 # number of lines to process at each iteration

# columns that should be read from the CSV file
columns = ['molecule_id','charge','db','drugsnow','hba','hbd','loc','nrb','smiles']

# Get number of lines in the CSV file
nlines = subprocess.check_output('wc -l %s' % in_csv, shell=True)
nlines = int(nlines.split()[0]) 

# connect to database
cnx = sqlite3.connect(out_sqlite)

# Iteratively read CSV and dump lines into the SQLite table
for i in range(0, nlines, chunksize):

    df = pd.read_csv(in_csv,  
            header=None,  # no header, define column header manually later
            nrows=chunksize, # number of rows to read at each iteration
            skiprows=i)   # skip rows that were already read

    # columns to read        
    df.columns = columns

    sql.to_sql(df, 
                name=table_name, 
                con=cnx, 
                index=False, # don't use CSV file index
                index_label='molecule_id', # use a unique column from DataFrame as index
                if_exists='append') 
cnx.close()    

以下は私の仕事の流れです。

import sqlalchemy as sa
import pandas as pd
import psycopg2

count = 0
con = sa.create_engine('postgresql://postgres:[email protected]:00001/r')
#con = sa.create_engine('sqlite:///XXXXX.db') SQLite
chunks = pd.read_csv('..file', chunksize=10000, encoding="ISO-8859-1",
                     sep=',', error_bad_lines=False, index_col=False, dtype='unicode')

あなたのファイルサイズに基づいて、あなたはchunkksizeを最適化する方がよいでしょう。

 for chunk in chunks:
        chunk.to_sql(name='Table', if_exists='append', con=con)
        count += 1
        print(count)

データベース内のすべてのデータを取得したら、必要なデータベースをデータベースから照会することができます。


原則としてメモリが不足してはいけませんが、複雑なPythonの内部的な問題によって大きなファイルにread_csvメモリに問題があります(これはあいまいですが、長い間知られています: http://github.com/pydata/pandas/issues/407 : http://github.com/pydata/pandas/issues/407 )。

現時点では完璧な解決策はありません(ここでは退屈なことがあります:ファイルを行np.mmap事前に割り当てられたNumPy配列またはメモリマップnp.mmapことがnp.mmap )近い将来に取り組んでいきます。 もう1つの解決策は、ファイルをより小さな部分で読むことです( iterator=True, chunksize=1000使用してpd.concat 。次にpd.concat連結しpd.concat 。 この問題は、テキストファイル全体を1つの大きなスラップでメモリにプルするときに発生します。







sas