之前使用Python读取超大CSV文件时,出现MemoryError错误,甚至死机。。。呕心沥血潜心研究后,发现使用pandas的read_csv模块通过分块读取,可以完美解决针对超大CSV文件进行数据分析处理时的内存不足问题,接下来与大家分享一下。
pandas 安装
Anaconda是一个开源的Python发行版本,其包含了conda、Python、numpy、pandas等180多个科学包及其依赖项。建议直接安装Anaconda2 或 Anaconda3 ,最好装64位。
下载地址如下:
https://www.anaconda.com/
read_csv官方文档链接:
http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table
从官方文档中我们注意到chunksize 、iterator两个参数,下面我们就这两个参数做详细介绍 。
Iteration
iterator : boolean, default False
Return TextFileReader object for iteration or getting chunks with get_chunk().
chunksize : int, default None
Return TextFileReader object for iteration. See iterating and chunking below.
read_csv——chunksize参数介绍
read_csv中有个参数chunksize,通过指定一个chunksize分块大小来读取文件,返回的是一个可迭代的对象TextFileReader,分块处理可以避免将所有的文件载入内存,仅在使用的时候读入所需内容。数据的处理和清洗通常使用分块的方式处理,可以大大降低内存的使用,同时耗时要相对长一些。
import pandas as pd
reader = pd.read_csv('pandas.csv', sep='|',chunksize=2)
for chunksize_data in reader:
print chunksize_data
输出
read_csv——iterator参数
指定iterator=True 也可以返回一个可迭代对象TextFileReader。
import pandas as pd
reader = pd.read_table('pandas.csv', sep='|', iterator=True)
status = True
while status:
try:
chunk = reader.get_chunk(2)
print chunk
except StopIteration:
status = False
输出
除了通过分块避免一次性将全部内容加载至内存中,还可以尝试如下方式读取超大csv文件进行数据分析、处理。
- 对数据进行降维
- 增大机器内存或使用spark集群(pyspark)
转载请说明,若你对有帮助,点赞支持哦。