gpt4 book ai didi

php - 使用 Laravel DB Seed 插入 100 万条记录

转载 作者:行者123 更新时间:2023-11-29 04:06:29 27 4
gpt4 key购买 nike

我正在使用 faker 获取虚拟数据并尝试添加 100 万条记录。不知何故我只能达到大约 100000 行,以下是我的代码

$no_of_rows = 1000000;

for( $i=1; $i <= $no_of_rows; $i++ ){
$user_data[] = [
'status' => 'ACTIVE',
'username' => $faker->userName,
'email' => $faker->email,
'password' => $password,
'firstname' => $faker->firstName,
'surname' => $faker->lastName,
'mobilenumber' => $faker->phoneNumber,
'confirmed' => (int)$faker->boolean(50),
'gender' => $faker->boolean(50) ? 'MALE' : 'FEMALE',
'dob' => $faker->date(),
'address_line_1' => $faker->address,
'address_line_2' => '',
'post_code' => $faker->postcode,
];


}

User::insert($user_data);

我收到以下错误消息

PHP Fatal error:  Allowed memory size of 1073741824 bytes exhausted

我已经设置了 ini_set('memory_limit', '1024M');

有什么有用的想法或解决方案吗?

最佳答案

这个问题的核心问题是Faker lib 实例(通常用于在 Laravel 中生成数据)占用大量内存,并且在大型循环中使用时无法被垃圾收集器正确清除。

我同意@ Rob Mkrtchyan 的处理过程上面添加了,但由于这是 Laravel,我会建议使用 Factory 设施的更优雅的解决方案。

你可以创建一个特定的模型工厂(在 Laravel 5.3 中这应该放在 database/factories/中),例如:

$factory->define(Tests::class, function (Faker\Generator $faker) {
return [
'status' => 'ACTIVE',
'username' => $faker->userName,
'email' => $faker->email,
'password' => bcrypt('secret'),
'firstname' => $faker->firstName,
'surname' => $faker->lastName,
'mobilenumber' => $faker->phoneNumber,
'confirmed' => (int)$faker->boolean(50),
'gender' => $faker->boolean(50) ? 'MALE' : 'FEMALE',
'dob' => $faker->date(),
'address_line_1' => $faker->address,
'address_line_2' => '',
'post_code' => $faker->postcode,
];
});

然后在您的 dB 播种器类中运行工厂是一件简单的事情。请注意,数字 200 表示要创建的种子数据条目数。

factory(Tests::class, 200)
->create();

使用种子工厂的原因是它允许您更灵活地设置变量等。有关这方面的文档,您可以查阅 Laravel docs on dB seeding

现在,由于您要处理大量记录,因此实现有助于 php 垃圾收集的分块解决方案就变得轻而易举了。例如:

for ($i=0; $i < 5000; $i++) {
factory(Tests::class, 200)
->create();
}

我做了一个快速测试,在这个配置中,无论创建的数据条目如何,您的脚本内存使用量应该在 12 - 15mb 左右(当然取决于其他系统因素)。

关于php - 使用 Laravel DB Seed 插入 100 万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429584/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com