水塘采样算法解决随机抽样需求
水塘采样算法解决随机抽样需求 需求场景: 如果我们现在有200万用户数据,需要从200万用户数据中以较好的随机性,随机抽取200个用户做案例分析或灰度发布; 尝试了多种算法,发现水塘采样算法是性能较好、随机性较好、算法空间复杂度平衡、比较适合泛用性需求场景; class ReservoirSampler { private $pdo; private $batchSize = 10000; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function sample($tableName, $k) { $reservoir = []; // 水塘,存储 k 个随机样本 $offset = 0; // 分页偏移量 $count = 0; // 已处理的元素总数 while (true) { // 分批读取数据,避免一次性加载所有数据 $sql = “SELECT * FROM {$tableName} […]