You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为大型Pandas DataFrame预分配内存?含大表创建场景

优化大型DataFrame的创建与填充方案

你的当前实现思路虽然可行,但在处理1000行×30001列这种规模的数据时,逐行用Series填充DataFrame的方式会带来严重的性能损耗——Pandas的DataFrame是列存储结构,逐行修改会频繁触发内存重新分配,效率极低。下面给你一套更高效的批量处理方案:

核心优化思路

  1. 用NumPy批量生成/收集数值型数据(比Pandas循环快几个数量级)
  2. 批量计算每行的哈希值
  3. 一次性合并所有数据创建DataFrame,避免逐行操作的开销

方案一:一次性生成所有数值数据

如果你的values可以批量生成(不需要逐行计算),直接用NumPy构造数组后合并:

import pandas as pd
import numpy as np
import hashlib

# 1. 生成30000列int64类型的批量数据(1000行)
# 这里用随机数示例,你可以替换成自己的数值生成逻辑
int_data = np.random.randint(low=0, high=1000, size=(1000, 30000), dtype=np.int64)

# 2. 批量计算每行的哈希值(以MD5为例,可根据需求更换算法)
def calculate_row_hash(row):
    # 将行数据转为字节串用于哈希计算
    row_bytes = row.tobytes()
    return hashlib.md5(row_bytes).hexdigest()

# 沿行轴应用哈希计算
hash_column = np.apply_along_axis(calculate_row_hash, axis=1, arr=int_data)

# 3. 构造列名
column_names = [f"col_{i}" for i in range(30000)] + ["hash_value"]

# 4. 合并数值数据与哈希列,创建最终DataFrame
df = pd.DataFrame(
    np.hstack((int_data, hash_column.reshape(-1, 1))),
    columns=column_names
)

# 确保前30000列是int64类型(hstack后可能被转为object,按需执行)
df.iloc[:, :-1] = df.iloc[:, :-1].astype(np.int64)

方案二:逐行生成数值但批量合并

如果你的values必须逐行生成(比如依赖外部数据源或逐行计算逻辑),先把所有行数据收集到列表,再批量转换为数组:

import pandas as pd
import numpy as np
import hashlib

int_rows = []
hash_list = []
column_names = [f"col_{i}" for i in range(30000)] + ["hash_value"]

for _ in range(1000):
    # 模拟逐行生成30000个int64值
    current_row = np.random.randint(0, 1000, size=30000, dtype=np.int64)
    int_rows.append(current_row)
    
    # 计算当前行的哈希值
    row_bytes = current_row.tobytes()
    hash_list.append(hashlib.md5(row_bytes).hexdigest())

# 把收集到的行数据转为NumPy数组
int_data = np.vstack(int_rows)
hash_column = np.array(hash_list)

# 一次性创建DataFrame
df = pd.DataFrame(
    np.hstack((int_data, hash_column.reshape(-1, 1))),
    columns=column_names
)
df.iloc[:, :-1] = df.iloc[:, :-1].astype(np.int64)

为什么你的原方案效率低?

  • 初始用np.empty创建的空DataFrame包含未初始化的垃圾值,后续逐行赋值会覆盖,但逐行修改DataFrame本质是不断重构数据结构,内存开销极大。
  • 每次循环创建Series再赋值给DataFrame,会触发Pandas内部的索引对齐、内存重新分配等操作,1000次循环下来性能会差到难以接受。

内存注意事项

30000列×1000行的int64数据,内存占用约为30000*1000*8=240MB,加上哈希列的字符串,整体内存占用在普通机器上完全可控。如果后续数据规模继续扩大,可以考虑分块处理或使用Dask等分布式框架。

内容的提问来源于stack exchange,提问作者pan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:20:52