usar tablas read_csv read para panda leer funciones documentacion datos con como comandos archivo python pandas csv memory chunks

python - tablas - read_csv pandas



Cómo leer un archivo csv de 6 GB con pandas (8)

Intento leer un gran archivo csv (aproximadamente 6 GB) en pandas y obtengo el siguiente error de memoria:

MemoryError Traceback (most recent call last) <ipython-input-58-67a72687871b> in <module>() ----> 1 data=pd.read_csv(''aphro.csv'',sep='';'') C:/Python27/lib/site-packages/pandas/io/parsers.pyc in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, skiprows, skipfooter, skip_footer, na_values, na_fvalues, true_values, false_values, delimiter, converters, dtype, usecols, engine, delim_whitespace, as_recarray, na_filter, compact_ints, use_unsigned, low_memory, buffer_lines, warn_bad_lines, error_bad_lines, keep_default_na, thousands, comment, decimal, parse_dates, keep_date_col, dayfirst, date_parser, memory_map, nrows, iterator, chunksize, verbose, encoding, squeeze, mangle_dupe_cols, tupleize_cols, infer_datetime_format) 450 infer_datetime_format=infer_datetime_format) 451 --> 452 return _read(filepath_or_buffer, kwds) 453 454 parser_f.__name__ = name C:/Python27/lib/site-packages/pandas/io/parsers.pyc in _read(filepath_or_buffer, kwds) 242 return parser 243 --> 244 return parser.read() 245 246 _parser_defaults = { C:/Python27/lib/site-packages/pandas/io/parsers.pyc in read(self, nrows) 693 raise ValueError(''skip_footer not supported for iteration'') 694 --> 695 ret = self._engine.read(nrows) 696 697 if self.options.get(''as_recarray''): C:/Python27/lib/site-packages/pandas/io/parsers.pyc in read(self, nrows) 1137 1138 try: -> 1139 data = self._reader.read(nrows) 1140 except StopIteration: 1141 if nrows is None: C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader.read (pandas/parser.c:7145)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader._read_low_memory (pandas/parser.c:7369)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader._read_rows (pandas/parser.c:8194)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader._convert_column_data (pandas/parser.c:9402)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader._convert_tokens (pandas/parser.c:10057)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser.TextReader._convert_with_dtype (pandas/parser.c:10361)() C:/Python27/lib/site-packages/pandas/parser.pyd in pandas.parser._try_int64 (pandas/parser.c:17806)() MemoryError:

¿Alguna ayuda en esto?


Chunking no siempre debe ser el primer puerto de escala para este problema.

1. ¿El archivo es grande debido a datos no numéricos repetidos o columnas no deseadas?

Si es así, a veces puede ver un ahorro masivo de memoria leyendo columnas como categorías y seleccionando columnas requeridas a través del parámetro pd.read_csv usecols .

2. ¿Su flujo de trabajo requiere rebanar, manipular, exportar?

Si es así, puede usar dask.dataframe para cortar, realizar sus cálculos y exportar iterativamente. Chunking se realiza en silencio por dask, que también es compatible con un subconjunto de pandas API.

3. Si todo lo demás falla, lea línea por línea en trozos.

Trozo a través de pandas o mediante la biblioteca csv como último recurso.


El error muestra que la máquina no tiene suficiente memoria para leer todo el CSV en un DataFrame a la vez. Suponiendo que no necesita todo el conjunto de datos en la memoria, todo a la vez, una forma de evitar el problema sería procesar el CSV en fragmentos (especificando el parámetro de chunksize ):

chunksize = 10 ** 6 for chunk in pd.read_csv(filename, chunksize=chunksize): process(chunk)


La función read_csv y read_table es casi la misma. Pero debe asignar el delimitador "," cuando usa la función read_table en su programa.

def get_from_action_data(fname, chunk_size=100000): reader = pd.read_csv(fname, header=0, iterator=True) chunks = [] loop = True while loop: try: chunk = reader.get_chunk(chunk_size)[["user_id", "type"]] chunks.append(chunk) except StopIteration: loop = False print("Iteration is stopped") df_ac = pd.concat(chunks, ignore_index=True)


La respuesta anterior ya está satisfaciendo el tema. De todos modos, si necesita todos los datos en la memoria, eche un vistazo a bcolz . Está comprimiendo los datos en la memoria. He tenido una muy buena experiencia con eso. Pero falta una gran cantidad de características de pandas

Editar: Obtuve tasas de compresión de alrededor de 1/10 o tamaño original, por supuesto, dependiendo del tipo de datos. Las características importantes que faltaban eran agregados.


Para grandes datos, recomiendo usar la biblioteca "dask"
p.ej:

# Dataframes implement the Pandas API import dask.dataframe as dd df = dd.read_csv(''s3://.../2018-*-*.csv'')


Procedí así:

chunks=pd.read_table(''aphro.csv'',chunksize=1000000,sep='';'',/ names=[''lat'',''long'',''rf'',''date'',''slno''],index_col=''slno'',/ header=None,parse_dates=[''date'']) df=pd.DataFrame() %time df=pd.concat(chunk.groupby([''lat'',''long'',chunk[''date''].map(lambda x: x.year)])[''rf''].agg([''sum'']) for chunk in chunks)


Puedes probar sframe, que tiene la misma sintaxis que pandas pero te permite manipular archivos que son más grandes que tu RAM.


Si usas pandas, lee un archivo grande en un trozo y luego cede fila por fila, esto es lo que hice

import pandas as pd def chunck_generator(filename, header=False,chunk_size = 10 ** 5): for chunk in pd.read_csv(filename,delimiter='','', iterator=True, chunksize=chunk_size, parse_dates=[1] ): yield (chunk) def _generator( filename, header=False,chunk_size = 10 ** 5): chunk = chunck_generator(filename, header=False,chunk_size = 10 ** 5) for row in chunk: yield row if __name__ == "__main__": filename = r''file.csv'' generator = generator(filename=filename) while True: print(next(generator))