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

如何将WatDiv基准1亿条RDF三元组随机拆分为两个各约5000万条的子数据集

方案合理性评估

你提出的「按谓词分组后组内随机抽取」的思路是合理的,本质属于统计学中的分层抽样,相比全局完全随机抽取,能最大程度保证两个子数据集的谓词分布和原1亿条三元组的WatDiv基准数据集一致,不会出现某类谓词在单个子集中占比异常偏高/偏低的问题,拆分得到的子集用于RDF相关测试时,结果参考性更强。
这个思路唯一的问题是初始实现逻辑的效率偏低:对全量1亿条三元组做全局谓词排序的时间、内存开销都很高,完全可以用更低成本的方式实现相同的分层抽样效果。

高效实现方案

根据你对拆分精度的要求,可以选两种实现路径,都比全排序后抽取的效率高很多:

方案1:极简流式实现(速度最快,零大内存开销)

如果能接受最终子数据集规模在4900万-5100万条之间浮动(这个偏差对基准测试完全无影响),可以直接用单遍扫描的概率抽样实现,全程不需要把数据集加载进内存:

  • 初始化两个子数据集的文件写入流
  • 逐行读取原三元组文件的每一条记录
  • 对每条三元组做两次独立的随机判定:以50%的概率决定是否写入第一个子集,再以50%的概率决定是否写入第二个子集。由于规则允许三元组同时出现在两个子集中,两次概率判定完全独立,不需要做互斥或去重处理,逻辑实现非常简单
  • 所有记录处理完成后关闭写入流即可
    这种方法的时间复杂度是纯O(n),在SSD上处理1亿条三元组只需要3-5分钟,机械盘也只需要15分钟左右,内存开销不到100MB。如果需要复现固定拆分结果,只要给随机数生成器设置固定种子(比如seed=42)即可。

方案2:精确分层抽样(严格匹配分布,大小误差<0.1%)

如果你需要严格控制每个子集的三元组总量在5000万左右,且每个谓词的占比和原数据集完全一致,可以用优化后的分层抽样逻辑,避免全量排序的高开销:

  1. 第一遍单遍扫描原数据集,只做两个统计:一是全量三元组总数,二是每个谓词对应的三元组条数,不需要存储三元组本身内容
  2. 按每个谓词的占比,算出每个谓词需要在单个子集中抽取的三元组数量(即该谓词总条数*0.5)
  3. 给每个谓词初始化对应容量的蓄水池,用蓄水池抽样算法做第二遍扫描:
    • 逐行读取三元组,根据谓词找到对应的蓄水池
    • 按蓄水池抽样规则随机决定是否将当前三元组放入蓄水池,池满时随机替换池内已有元素
  4. 所有三元组扫描完成后,把每个谓词蓄水池内的样本同时写入两个子数据集文件即可
    这种方法同样不需要全量排序,也不需要把所有三元组加载进内存,内存开销只和所有蓄水池的总容量相关(如果只存三元组的文件偏移量,总内存占用仅几百MB),比全排序的实现快10倍以上。
拆分后校验建议

拆分完成后可以做个简单的快速校验,避免抽样偏差:

  • 统计两个子集的三元组总条数,确认和5000万的目标值偏差在可接受范围内
  • 抽几个占比最高/最低的谓词,统计它们在两个子集中的条数,和原数据集的占比做对比,偏差控制在1%以内就完全符合基准测试要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:12:28