1

我已经检查了这个问题,但没有找到适合我需要的解决方案。

我已经为州、城市和地区创建了表格,其中有 37、7431 和 91853 条记录可用。

当我使用 create 而不是在播种器中使用 insert 时,它需要更长的时间。

因此,我通过将 create 替换为 insert 来更改我的代码。然后通过Laravel Daily Video了解了这个块。

块在 CitySeeder 中运行良好,但在 LocalitySeeder 中出现问题。

这是我的播种机中的代码:

    <?php
    
    namespace Database\Seeders;
    
    use App\Models\Locality;
    use Illuminate\Database\Seeder;
    
    class LocalitySeeder extends Seeder
    {
        public function run()
        {
            $input = [
                [ 'name' => 'Adilabad', 'city_id' => 5487, 'created_at' => now()->toDateTimeString(), 'updated_at' => now()->toDateTimeString() ],
.
.
.
.
.
.
.
.
                [ 'name' => 'Nalgonda', 'city_id' => 5476, 'created_at' => now()->toDateTimeString(), 'updated_at' => now()->toDateTimeString() ],];
    $chunks = array_chunk($input, 5000, true);
            foreach ($chunks as $key => $data) {
                Locality::insert($data);
            }
        }
    }

错误图像 错误图像

使用 create 工作图像 沃金形象

提前致谢。

4

1 回答 1

1

您正在尝试加载一个包含接近 92K 条目的数组 ( $input),然后将其复制到一个带有array_chunk. 您已配置(或在安装期间设置)的内存限制不允许您使用这么多 RAM。正如 Daniel 指出的那样,解决此问题的一种方法是增加内存限制,但另一种方法可能是从种子文件中读取这些数据。我将在下面尝试说明这一点,但您可能需要稍微调整一下。

localities.json中,注意每一行都是一个单独的 JSON 对象

{"name": "Adilabad", "city_id": 5487}
[...]
{"name": "Nalgonda", "city_id": 5476}

然后在seeder类中,可以实现run方法如下:

$now = now()->toDateTimeString();
$handle = fopen(__DIR__."/localities.json");
while(($line = fgets($handle)) !== FALSE){
  $data = json_decode($line, TRUE);
  $data["created_at"] = $now;
  $data["updated_at"] = $now;
  Locality::insert($data);
}

编辑:关于这将花费的时间,这么多数据总是很慢,但是播种机并不意味着经常运行。

于 2021-11-18T20:25:36.637 回答