Il s'agit d'un ancien fil de discussion, mais je voulais simplement déposer ma solution de contournement ici. J'ai d'abord essayé le chunksize
(même avec des valeurs assez petites comme 10000), mais cela n'a pas aidé beaucoup ; j'avais encore des problèmes techniques avec la taille de la mémoire (mon CSV était ~ 7.5 Gb).
Pour l'instant, je lis simplement des morceaux de fichiers CSV dans une approche for-loop et je les ajoute, par exemple, à une base de données SQLite, étape par étape :
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()
0 votes
Je ne suis pas familier avec pandas, mais vous pourriez envisager d'itérer dans le fichier. pandas.pydata.org/pandas-docs/stable/