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

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

数据 使用 chunk 写入 967    来源:    2025-03-13

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

1. 分块写入

将大数据帧分成多个小块,逐块写入文件。这样可以减少内存占用,并避免一次性写入大量数据导致的性能瓶颈。

```python import pandas as pd

# 假设 df 是你的大数据帧 chunk_size = 1000000 # 每块的大小 for i, chunk in enumerate(range(0, len(df), chunk_size)): df_chunk = df[i:i + chunk_size] mode = 'w' if i == 0 else 'a' # 第一次写入时使用 'w' 模式,后续使用 'a' 追加模式 header = i == 0 # 只在第一次写入时包含表头 df_chunk.to_csv('large_file.csv', mode=mode, header=header, index=False) ```

2. 使用更高效的文件格式

CSV 文件是文本格式,读写速度较慢。考虑使用更高效的二进制文件格式,如 ParquetFeather,这些格式在读写大数据集时性能更好。

```python # 使用 Parquet 格式 df.to_parquet('large_file.parquet')

# 使用 Feather 格式 df.to_feather('large_file.feather') ```

3. 压缩文件

使用压缩可以减少文件大小,从而减少 I/O 时间。to_csv() 支持多种压缩格式,如 gzipbz2 等。

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

4. 使用 Dask

Dask 是一个并行计算库,可以处理比内存更大的数据集。它提供了与 pandas 类似的 API,但可以并行处理数据。

```python import dask.dataframe as dd

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

# 使用 Dask 的 to_csv 方法 ddf.to_csv('large_file_*.csv', index=False) ```

5. 减少数据精度

如果数据中的浮点数精度过高,可以考虑降低精度,减少数据量。

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

6. 使用多线程或多进程

如果硬件支持,可以使用多线程或多进程来并行处理数据写入。

```python from multiprocessing import Pool

def save_chunk(chunk, filename): chunk.to_csv(filename, index=False)

pool = Pool(processes=4) # 使用4个进程 results = [pool.apply_async(save_chunk, args=(df[i:i + chunk_size], f'large_file_part_{i}.csv')) for i in range(0, len(df), chunk_size)] pool.close() pool.join() ```

7. 优化 I/O 操作

确保你的存储设备(如 SSD)性能良好,并且文件系统没有其他瓶颈。

8. 使用数据库

如果数据量非常大,考虑将数据存储到数据库中,而不是直接写入文件。数据库通常能更好地处理大规模数据。

```python from sqlalchemy import create_engine

# 创建数据库连接 engine = create_engine('sqlite:///large_file.db')

# 将数据写入数据库 df.to_sql('large_table', engine, if_exists='replace', index=False) ```

9. 减少索引

如果不需要索引,可以在保存时禁用索引,以减少写入的数据量。

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

10. 使用更快的硬件

如果可能,使用更快的存储设备(如 NVMe SSD)或增加内存容量,以提高整体性能。

通过以上方法,你可以显著提高 to_csv() 函数的性能,特别是在处理大规模数据集时。