Il s'agit d'un thread plus ancien, mais je voulais juste vider ma solution de contournement ici. J'ai d'abord essayé le chunksize
paramètre (même avec des valeurs assez petites comme 10000), mais cela n'a pas beaucoup aidé; avait encore des problèmes techniques avec la taille de la mémoire (mon CSV était ~ 7,5 Go).
Pour le moment, je viens de lire des morceaux des fichiers CSV dans une approche en boucle for et de les ajouter, 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()