Как сделать загрузку CSV быстрее? - PullRequest
1 голос
/ 01 декабря 2011

Мне было интересно, кто-нибудь из вас, ребята, что-то пробовал с миграцией CSV в живом виде (multipart / form-data), работает моя единственная вещь, которую я ненавижу, это то, что она отнимает так много времени и достигает максимумаТайм-аут выполнения.Быстрое исправление, которое я сделал, установил максимальное время выполнения в моем php.ini (или set_time_limit ()), но меня действительно раздражает ожидание полчаса только для импорта целых данных, хотя это не более 100 КБ.Я просто слишком остро реагирую или что-то еще?

Это код:

function upload($id, $old_eid)
{

    $filename = $_FILES['event_file']['tmp_name'];
    $handle = fopen($filename, "r");

    while(($data = fgetcsv($handle, 1000, ",")) !== FALSE){
        $id  = $id;
        $id2 = $data[2];
        $ckr = $this->Manager_model->check_if_record_exists($id, $id2);

        if(count($ckr) > 0):
            $this->session->set_flashdata('err', '<div class="error">Duplicated record</div>');
            redirect("manager/csver/$id");
        else:
            $data['col1'] = $data[0];
            $data['col2']  = $id;
            $data['col3'] = $data[3].' '.$data[4];
            $data['col4']  = $data[2];
            $data['col5'] = $data[6];
            $data['col6']  = $data[1];
            $data['col7']  = $data[7];

            $data['col8']  = mt_rand(11111, 99999);
            $data['col9']   = $old_eid;

            $this->Manager_model->add_csv($data);
            $this->Manager_model->add_csv_to_photo($data);

        endif;
    }
        fclose($handle);
        $this->session->set_flashdata('success', '<div class="success">CSV successfully uploaded</div>');
        redirect("manager/records/$id");
        //$this->session->set_flashdata('msg', '<div class="success">Records successfully uploaded</div>');
} 

Мой Manager_model:

 function add_csv($data)
{
    $src = array(
            'col1'=> $data['col1'],
            'col2'    => $data['col2'],
        'col3' => $data['col3'],
        'col4'  => $data['col4'],
        'col5' => $data['col5'],
        'col6'  => $data['col6'],
        'col7' => $data['col7'],
        'col8' => $data['col8'],
    );
    $this->db->insert('e_records2', $src);

    if($this->db->affected_rows() == '1'):
        return TRUE;
    endif;

    return FALSE;
}

function add_csv_to_photo($data) {
    $src = array(
            'col1'=> $data['col1'],
               'col2' => $data['col2'],
                'col3' => $data['col3'],
                'col4' => $data['col4'],
                'col5'=> $data['col5'],
                'col6'=> $data['col6'],
    );
    $this->db->insert('e_records', $src);

    if($this->db->affected_rows() == '1'):
        return TRUE;
    endif;

    return FALSE;
} function check_if_record_exists($id, $id2) 
{
    $eid = $id;
    $id2 = $id2;
    $query = $this->db->query("select * from races_results where eid = $eid AND id2 = $id2");
    return $query->result();
}

PS Я не говорю о PhpMyAdmin, потому чтознать, как там работает импорт CSV-файла.И плюс это создаст много тривиальных задач, чтобы иметь файл для миграции с использованием кости.

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

Почему бы не запустить профилировщик для оптимизации вашего кода? Codeigniter включает в себя этот полезный кусок для таких проблем http://codeigniter.com/user_guide/general/profiling.html

Это даст вам разбивку ваших SQL-запросов, что займет много времени и где.

$this->output->enable_profiler(TRUE);

1 голос
/ 01 декабря 2011

$ id = $ id;

действительно

$ ckr = $ this-> Manager_model-> check_if_record_exists ($ id, $ id2);

Один очевидный способ сделать это быстрее - это иметь уникальный индекс на eid и id2 и игнорировать ошибки повторяющихся строк на INSERT.

Но на самом деле, если вы хотите, чтобы он шел намного быстрее, просто скажите mysql для анализа и загрузки данных .

1 голос
/ 01 декабря 2011

Мне кажется, что проблема в том, что вы запрашиваете БД один раз (или два раза?) На строку в вашем CSV-файле.
Конечно, вы получите ужасную производительность.
Вы можете выполнить весь запрос за один раз, и БД сделает CSV за вас в кратчайшие сроки.

SELECT DISTINCT f1,f2,f3,... FROM tablex WHERE .. INTO OUTFILE 'c:/dir/ca.csv' 
  FIELDS ESCAPED BY '"' FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n';
//note the use of forward slashes even on Windows.

См .: http://dev.mysql.com/doc/refman/5.0/en/select-into.html

Скорость самого выбора здесь является ограничивающим фактором.
Убедитесь, что у вас есть права на запись в каталог, и обратите внимание, что MySQL никогда не будет перезаписывать файлы.
Эта команда очень быстро работает на MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...