我正在尝试将一些信息读入 Pandas DataFrame 并面临由于数据值而导致的问题。
电脑规范:
内存 32 GB
英特尔酷睿 i7 4GHz
设置:
数据位于 MySQL DB 中,9 列(7 个整数、1 个日期、1 个日期时间)。数据库位于本地计算机上,因此不存在互联网带宽问题。 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
,不同的 block 大小,low_memory
为True
和False
,指定了 dtypes,但未指定,但仍然收到 MemoryError
。
我尝试了上面问题中提到的所有内容(被标记为来源,我的被标记为重复),但没有任何变化。
我只发现了两个区别:
如果我在没有 block 的情况下进行解析,则会在解析时出现内存错误。
当我分块解析时 - 连接成一个 DF。
此外,按 5_000_000 行分块会在解析时产生错误,而在串联时会产生错误。
这是有关串联的错误消息:
pandas.errors.ParserError: Error tokenizing data. C error: out of memory
最佳答案
基本上,问题出在内存上。 我玩了一下 block 大小+添加了一些过滤,我后来在 block 的代码中添加了这些过滤。 这使我能够将数据帧放入内存中。
关于mysql - 读取 csv 时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53960080/