首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更有效地处理100 K条目的数据输入?

问如何更有效地处理100 K条目的数据输入?
EN

Stack Overflow用户
提问于 2011-10-20 14:46:00
回答 1查看 159关注 0票数 0

我有一个csv文件,它有大约100 K的条目,我需要处理并插入到数据库中。

以前,它非常慢,因为它对每个条目都进行了SQL调用。但是,我这样做是因为如果我试图构建一个查询来完成这个任务,那么我的内存就会耗尽。

我迁移到一个新服务器,现在每次运行它时都会收到一个错误:

SQL错误:2006年MySQL服务器已消失。

我不确定,但我认为这只是因为我的代码效率有多低。

我能做些什么才能使它更好地表现,而又不会得到错误呢?

以下是代码:

代码语言:javascript
复制
//empty table before saving new feed
$model->query('TRUNCATE TABLE diamonds');

$fp = fopen($this->file,'r');

while (!feof($fp)) 
{
    $diamond = fgetcsv($fp);

    //skip the first line
    if(!empty($firstline))
    {
        $firstline = true;
        continue;   
    }

    if(empty($diamond[17]))
    {
        //no price -- skip it
        continue;
    }

    $data = array(
        'seller'             => $diamond[0],                             
        'rapnet_seller_code' => $diamond[1],                         
        'shape'              => $diamond[2],
        'carat'              => $diamond[3],
        'color'              => $diamond[4],
        'fancy_color'        => $diamond[5],
        'fancy_intensity'    => $diamond[6],
        'clarity'            => empty($diamond[8]) ? 'I1' : $diamond[8],
        'cut'                => empty($diamond[9]) ? 'Fair' : $diamond[9],
        'stock_num'          => $diamond[16],
        'rapnet_price'       => $diamond[17],
        'rapnet_discount'    => empty($diamond[18]) ? 0 : $diamond[18],
        'cert'               => $diamond[14],
        'city'               => $diamond[26],
        'state'              => $diamond[27],
        'cert_image'         => $diamond[30],
        'rapnet_lot'         => $diamond[31]
    );

    $measurements = $diamond[13];
    $measurements = strtolower($measurements);
    $measurements = str_replace('x','-',$measurements);
    $mm = explode('-',$measurements);

    $data['mm_width'] = empty($mm[0]) ? 0 : $mm[0];
    $data['mm_length'] = empty($mm[1]) ? 0 : $mm[1];
    $data['mm_depth'] = empty($mm[2]) ? 0 : $mm[2];

    //create a new entry and save the data to it.
    $model->create();
    $model->save($data);

}
fclose($fp);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-20 14:52:01

您可能超过了MySQL的封包设置,该设置对查询字符串的长度设置了硬限制(以字节为单位)。做多值插入没有什么错,但是其中的100 k肯定是在推动事情。

不要一次做所有的100 k,试着在一个循环中完成1000。您仍然在减少总查询次数(从100 K下降到只有1000),所以它仍然是一个净收益。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7837719

复制
相关文章

相似问题

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