【发布时间】:2018-03-19 09:06:08
【问题描述】:
我正在尝试在 pandas 数据框中加载 csv 文件。但是,Python 在加载文件时会占用大量内存。例如,csv 文件的大小为 289 MB,但当我尝试加载文件时,内存使用量约为 1700 MB。此时,系统显示内存错误。我也尝试过块大小,但问题仍然存在。谁能告诉我前进的方向?
【问题讨论】:
我正在尝试在 pandas 数据框中加载 csv 文件。但是,Python 在加载文件时会占用大量内存。例如,csv 文件的大小为 289 MB,但当我尝试加载文件时,内存使用量约为 1700 MB。此时,系统显示内存错误。我也尝试过块大小,但问题仍然存在。谁能告诉我前进的方向?
【问题讨论】:
好的,首先,不要混淆磁盘大小和内存大小。 csv 的核心是纯文本文件,而 pandas 数据框是加载在内存中的复杂对象。也就是说,考虑到我不知道您的 csv 中有什么,我无法就您的具体情况发表声明。因此,我将在我的计算机上为您提供一个具有相似大小的 csv 示例:
-rw-rw-r-- 1 alex users 341M Jan 12 2017 cpromo_2017_01_12_rec.csv
现在读取 CSV:
>>> import pandas as pd
>>> df = pd.read_csv('cpromo_2017_01_12_rec.csv')
>>> sys:1: DtypeWarning: Columns (9) have mixed types. Specify dtype option on import or set low_memory=False.
>>> df.memory_usage(deep=True).sum() / 1024**2
1474.4243307113647
Pandas 会尽可能地优化它,但它无法做到不可能的事情。如果您的内存不足,请this answer is a good place to start。或者,您可以尝试dask,但我认为这对于小型 csv 来说工作量太大。
【讨论】:
您可以使用库“dask”
例如:
# Dataframes implement the Pandas API
import dask.dataframe as dd`<br>
df = dd.read_csv('s3://.../2018-*-*.csv')
【讨论】:
像这样尝试 - 1) 使用 dask 加载,然后 2) 转换为 pandas
import pandas as pd
import dask.dataframe as dd
import time
t=time.clock()
df_train = dd.read_csv('../data/train.csv', usecols=[col1, col2])
df_train=df_train.compute()
print("load train: " , time.clock()-t)
【讨论】: