首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在幼虫上插入大数据?

如何在幼虫上插入大数据?
EN

Stack Overflow用户
提问于 2018-07-24 06:02:05
回答 4查看 14.3K关注 0票数 6

我使用的是laravel 5.6

我插入大数据的脚本是这样的:

代码语言:javascript
运行
复制
...
$insert_data = [];
foreach ($json['value'] as $value) {
    $posting_date = Carbon::parse($value['Posting_Date']);
    $posting_date = $posting_date->format('Y-m-d');
    $data = [
        'item_no'                   => $value['Item_No'],
        'entry_no'                  => $value['Entry_No'], 
        'document_no'               => $value['Document_No'],
        'posting_date'              => $posting_date,
        ....
    ];
    $insert_data[] = $data;
}
\DB::table('items_details')->insert($insert_data);

我已经尝试插入100条记录与脚本,它的工作。它成功地插入了数据

但是如果我尝试用脚本插入50000条记录,它会变得非常慢。我已经等了大约10分钟,但它没有起作用。存在如下错误:

代码语言:javascript
运行
复制
504 Gateway Time-out

如何解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-07-24 15:49:10

如前所述,在这种情况下,如果是时间执行问题,分块并不能真正帮助您。我认为您尝试使用的bulk insert无法处理如此大量的数据,因此我看到了两种选择:

1-重新组织代码以正确使用块,如下所示:

代码语言:javascript
运行
复制
$insert_data = [];

foreach ($json['value'] as $value) {
    $posting_date = Carbon::parse($value['Posting_Date']);

    $posting_date = $posting_date->format('Y-m-d');

    $data = [
        'item_no'                   => $value['Item_No'],
        'entry_no'                  => $value['Entry_No'], 
        'document_no'               => $value['Document_No'],
        'posting_date'              => $posting_date,
        ....
    ];

    $insert_data[] = $data;
}

$insert_data = collect($insert_data); // Make a collection to use the chunk method

// it will chunk the dataset in smaller collections containing 500 values each. 
// Play with the value to get best result
$chunks = $insert_data->chunk(500);

foreach ($chunks as $chunk)
{
   \DB::table('items_details')->insert($chunk->toArray());
}

这样,您的大容量插入将包含较少的数据,并且能够以相当快的方式处理它。

2-如果你的主机支持运行时重载,你可以在代码开始执行之前添加一个指令:

代码语言:javascript
运行
复制
ini_set('max_execution_time', 120 ) ; // time in seconds

$insert_data = [];

foreach ($json['value'] as $value)
{
   ...
}

要阅读更多内容,请访问官方docs

票数 19
EN

Stack Overflow用户

发布于 2019-08-12 03:37:31

使用数组然后将其转换为集合是没有意义的。

我们可以摆脱数组。

代码语言:javascript
运行
复制
$insert_data = collect();

foreach ($json['value'] as $value) {
    $posting_date = Carbon::parse($value['Posting_Date']);

    $posting_date = $posting_date->format('Y-m-d');

    $insert_data->push([
        'item_no'                   => $value['Item_No'],
        'entry_no'                  => $value['Entry_No'], 
        'document_no'               => $value['Document_No'],
        'posting_date'              => $posting_date,
        ....
    ]);
}

foreach ($insert_data->chunk(500) as $chunk)
{
   \DB::table('items_details')->insert($chunk->toArray());
}
票数 3
EN

Stack Overflow用户

发布于 2020-02-20 14:16:42

这是一个非常好而且非常快的插入数据的解决方案

代码语言:javascript
运行
复制
$no_of_data = 1000000;
$test_data = array();
for ($i = 0; $i < $no_of_data; $i++){
    $test_data[$i]['number'] = "1234567890";
    $test_data[$i]['message'] = "Test Data";
    $test_data[$i]['status'] = "Delivered";
}
$chunk_data = array_chunk($test_data, 1000);
if (isset($chunk_data) && !empty($chunk_data)) {
   foreach ($chunk_data as $chunk_data_val) {
    DB::table('messages')->insert($chunk_data_val);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51487769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档