我正在尝试将一些信息读取到Pandas DataFrame中,并且由于数据的价值而面临问题。
PC规格:
RAM 32 GB
IntelCore i7 4GHz
设置:
数据在MySQL DB中,共有9列(7个整数,1个日期,1个DateTime)。 DB在本地计算机上,因此没有Internet带宽问题。 2200万数据行。
试图直接从MySQL服务器读取-它永远不会结束。
engine = sqlalchemy.create_engine('mysql+pymysql://root:@localhost:3306/database')
search_df = pd.read_sql_table('search', engine)
我与SO进行了核对,得出的印象是,与其使用连接器,不如解析CSV更好。我将表格导出为CSV。
CSV文件大小-1.5GB
我的代码
dtype = {
'search_id' : int,
'job_count_total' : int,
'job_count_done' : int,
'city_id_start' : int,
'city_id_end' : int,
'date_start' : str,
'datetime_create' : str,
'agent_id' : int,
'ride_segment_found_cnt' : int
}
search_df = pd.read_csv('search.csv', sep=',', dtype=dtype)
我尝试了两种引擎,c
和python
,不同的块大小,low_memory
为True
和False
,未指定dtype,但仍然得到MemoryError
。
我尝试了上面问题中提到的所有内容(标记为起源,我的标记为重复),但没有任何变化。
我发现只有两个区别:
如果我没有分块地进行分析,则在分析时会出现内存错误。
当我分块解析时-连接到一个DF上。
此外,按5_000_000行进行分块会在解析时产生错误,而在连接时会产生错误。
以下是串联时的错误消息:
pandas.errors.ParserError: Error tokenizing data. C error: out of memory
答案 0 :(得分:0)
基本上,问题出在内存上。 我在块大小上玩了一点,并增加了一些过滤,稍后我在块中的代码中进行了过滤。 这使我可以将数据框放入内存中。