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

如何为超内存容量的数据集添加并列列(Pandas+ArcticDB)

ArcticDB动态Schema下添加列的正确解决方案

问题说明

设置library_options=LibraryOptions(dynamic_schema=True)后,调用append方法试图为已有数据集添加新列,结果却得到行堆叠、缺失值补0的数据集,而非预期的列合并结果。这是因为append的设计是按行追加数据,要求新数据的首行索引不小于现有数据的末行索引,并非用于列扩展。

若采用先全量读取数据、用Pandasmerge合并后再写入的方式,面对超内存的大型数据集时,会消耗大量内存与时间,且无法持续扩展列。

复现代码

  1. 创建带动态Schema的Library
from arcticdb import Arctic
from arcticdb import LibraryOptions
import pandas as pd

ac = Arctic('lmdb://D:/Database?map_size=100GB')
if 'test' not in ac.list_libraries():
    ac.create_library(name='test', library_options=LibraryOptions(dynamic_schema=True))
  1. 写入初始数据
df = pd.DataFrame(
   {'column_1': range(1,6)},
   index=pd.date_range(start='1/1/2018', end='1/5/2018', name='date')
).reset_index()

lib = ac['test']
lib.write('symbol', df, prune_previous_versions=True)
  1. 错误的列添加方式(行堆叠而非列合并)
to_append_df = pd.DataFrame(
   {'column_2': range(6,11)},
   index=pd.date_range(start='1/1/2018', end='1/5/2018', name='date')
).reset_index()

lib.append('symbol', to_append_df)

解决方案

使用ArcticDB的write方法并指定merge=True参数,该参数会在存储层面基于索引匹配自动合并列,无需将全量数据加载到内存,完美适配超大型数据集的列扩展需求。

正确代码示例

# 基于索引匹配实现列合并,无需加载全量数据
lib.write('symbol', to_append_df, merge=True, prune_previous_versions=True)

# 验证结果
result_df = lib.read('symbol').data
print(result_df)

执行后将得到预期的列合并结果:

datecolumn_1column_2
2018-01-0116
2018-01-0227
2018-01-0338
2018-01-0449
2018-01-05510

关键说明

  • merge=True仅在dynamic_schema=True的Library中生效,会自动匹配现有数据与新数据的索引,合并新增列的同时保留原有列数据。
  • 该操作无需加载全量数据到内存,所有合并逻辑在ArcticDB存储层完成,大幅降低内存消耗与处理时间,适合持续添加列的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:03