插件窝 干货文章 Pandas to_csv()函数保存2000万条记录的大数据帧耗时过长,如何优化?

Pandas to_csv()函数保存2000万条记录的大数据帧耗时过长,如何优化?

chunk 写入 数据 csv 864    来源:    2025-03-15

处理大规模数据集时,pandasto_csv()函数可能会因为内存和I/O的限制而变得非常慢。以下是一些优化建议,帮助你加快保存大数据帧的速度:

1. 分块写入

将数据帧分成多个小块,逐块写入文件。这样可以减少内存压力,并利用磁盘I/O的并行性。

```python import pandas as pd

# 假设df是你的大数据帧 chunk_size = 1000000 # 每块100万条记录 for i, chunk in enumerate(range(0, len(df), chunk_size)): df_chunk = df[i:i + chunk_size] header = i == 0 # 只在第一块写入表头 df_chunk.to_csv('large_file.csv', mode='a', header=header, index=False) ```

2. 使用dask

dask是一个并行计算库,可以处理比内存更大的数据集。它提供了类似于pandas的API,并且可以自动分块处理数据。

```python import dask.dataframe as dd

# 将pandas DataFrame转换为dask DataFrame ddf = dd.from_pandas(df, npartitions=10)

# 保存到CSV ddf.to_csv('large_file_*.csv', index=False) ```

3. 使用fastparquetpyarrow保存为Parquet格式

Parquet是一种列式存储格式,通常比CSV更高效,尤其是在处理大数据集时。fastparquetpyarrow是两个常用的库。

python df.to_parquet('large_file.parquet', engine='pyarrow')

4. 禁用索引

如果你不需要保存索引,可以禁用索引写入,这样可以减少I/O操作。

python df.to_csv('large_file.csv', index=False)

5. 使用压缩

如果你的磁盘I/O是瓶颈,可以考虑使用压缩来减少写入的数据量。to_csv()函数支持多种压缩格式,如gzipbz2等。

python df.to_csv('large_file.csv.gz', compression='gzip', index=False)

6. 使用多线程或多进程

如果你有多个CPU核心,可以考虑使用多线程或多进程来并行写入数据。

```python from multiprocessing import Pool

def save_chunk(chunk, filename): chunk.to_csv(filename, mode='a', header=False, index=False)

chunk_size = 1000000 chunks = [df[i:i + chunk_size] for i in range(0, len(df), chunk_size)]

with Pool() as pool: pool.starmap(save_chunk, [(chunk, 'large_file.csv') for chunk in chunks]) ```

7. 使用更快的存储介质

如果你的磁盘速度较慢,考虑使用SSD或NVMe等更快的存储介质。

8. 减少数据精度

如果数据精度不是特别重要,可以考虑减少浮点数的精度,从而减少数据量。

python df = df.round(4) # 保留4位小数

9. 使用csv.writer直接写入

如果你对性能要求极高,可以考虑使用Python内置的csv.writer直接写入CSV文件,这样可以避免pandas的一些开销。

```python import csv

with open('large_file.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(df.columns) # 写入表头 for row in df.itertuples(index=False, name=None): writer.writerow(row) ```

通过以上方法,你可以显著提高保存大数据帧的速度。根据你的具体需求和环境,选择最适合的优化策略。