【发布时间】:2025-11-28 04:40:01
【问题描述】:
我有一个包含大量值 (53,000,000+) 的数据文件,我想提取这些值的 n 个随机子集(例如,2,000,000)。我实现了一个 Perl 脚本,它将列表拉入内存,使用 Fisher-Yates method 对数组进行混洗,然后打印出混洗列表中的第一个 n 值。然而,这个洗牌过程需要很多时间,即使是在更小的测试集(50,000 个值)上也是如此。
我正在寻找一种更高效、可扩展的方法来识别大量值的随机子集并将其打印出来。有什么建议吗?
更新:根据答案和更多搜索,正确的术语似乎是“随机抽样”。
【问题讨论】:
-
你如何交换)? I/O 是瓶颈还是洗牌?也许一些代码也会有所帮助。
-
@delnan 我尝试了链接线程中描述的两种方法。 I/O 绝对不是问题。它会很快加载到内存中,但随后会在洗牌步骤上花费 很多 时间。它永远不会完成并开始打印。既然我已经尝试过了,我认为洗牌方法对于这么多值的效率不够高,所以我可能对替代方法更感兴趣。
-
您需要数据有多随机?您可能可以使用一个循环,该循环通过随机索引跳转,然后在检索元素后将其标记为“已使用”以防止重复。
标签: performance random sampling random-sample