File size too high:4GB Yelp评论数据集在IPython Notebook中Pandas加载过慢求优化方案
嘿,这个问题我太熟了——处理4GB级别的Yelp评论CSV时,Pandas直接read_csv确实容易卡得让人着急。给你几个亲测有效的替代方案,从简单调整到工具替换都有,按需选:
1. 分块加载(Chunking)—— 用Pandas本身拆分批处理
如果内存不够一次性装下整个数据集,直接用Pandas的分块功能,把大文件拆成小份逐块读取处理,最后再合并结果(如果需要的话)。
示例代码:
import pandas as pd # 设置每块大小,比如10万行,根据你的内存调整 chunk_size = 100000 chunks = [] for chunk in pd.read_csv('yelp_reviews.csv', chunksize=chunk_size): # 在这里对每个块做预处理,比如过滤、计算 filtered_chunk = chunk[chunk['stars'] >= 4] chunks.append(filtered_chunk) # 合并所有块得到最终数据集 final_df = pd.concat(chunks, ignore_index=True)
优势:不用换工具,完全基于Pandas,适合内存紧张的场景,避免一次性加载爆内存。
2. 转成高效列式存储格式—— 一劳永逸提速
CSV是行式存储,读写效率低。把它转成Parquet或Feather这类列式存储格式,后续加载速度会快好几倍,还能节省磁盘空间(压缩率高)。
示例代码(转Parquet):
# 先一次性读入(如果能装下的话),或者分块合并后转格式 df = pd.read_csv('yelp_reviews.csv') # 需要安装pyarrow或fastparquet库,比如pip install pyarrow df.to_parquet('yelp_reviews.parquet') # 后续加载直接用: fast_df = pd.read_parquet('yelp_reviews.parquet')
优势:后续加载速度大幅提升,而且读取时可以只加载需要的列,进一步节省资源。
3. 只加载需要的列—— 减少无用数据加载
如果你的分析只用到部分列,别加载整个文件!用usecols参数指定要读的列,直接砍掉不必要的内存开销。
示例代码:
# 假设只需要评论内容、评分和用户ID df = pd.read_csv('yelp_reviews.csv', usecols=['text', 'stars', 'user_id'])
优势:最简单的优化手段,立竿见影减少加载时间和内存占用。
4. 手动指定数据类型—— 压缩内存占用
Pandas默认会给列分配较大的数据类型(比如把整数默认设为int64,字符串设为object),手动指定更小的合适类型能大幅压缩内存,间接加快加载速度。
示例代码:
# 先读一小部分数据分析类型 sample_df = pd.read_csv('yelp_reviews.csv', nrows=1000) # 比如stars是1-5的整数,可以用int8;类别型字符串用category dtype_spec = { 'stars': 'int8', 'business_category': 'category', 'user_id': 'string' # 比object更高效的字符串类型 } df = pd.read_csv('yelp_reviews.csv', dtype=dtype_spec)
优势:内存占用可能减少50%以上,加载和后续操作都会更流畅。
5. 用Dask替代Pandas—— 并行处理超大数据
Dask是专门处理大数据的库,接口和Pandas几乎一致,能利用多核心并行加载和处理数据,甚至能处理比内存大得多的文件。
示例代码:
import dask.dataframe as dd # 加载方式和Pandas类似,自动分块并行处理 dask_df = dd.read_csv('yelp_reviews.csv') # 做Pandas一样的操作,比如过滤、分组 high_rated = dask_df[dask_df['stars'] >= 4] # 需要计算结果时调用compute()转成Pandas DataFrame result_df = high_rated.compute()
优势:学习成本低,不用改太多代码就能处理超大数据,充分利用CPU多核。
6. 用Vaex—— 内存映射零压力
Vaex用内存映射技术,不用把整个文件加载到内存,就能快速打开几十GB的文件,支持懒加载和快速探索。
示例代码:
import vaex # 直接加载,几乎瞬间完成 vaex_df = vaex.read_csv('yelp_reviews.csv') # 查看前几行、统计信息都很快 vaex_df.head() vaex_df['stars'].describe()
优势:内存占用极低,适合快速探索大数据集,不用等待漫长的加载时间。
内容的提问来源于stack exchange,提问作者Sarthak Maheshwari

