문제

나는 txt 형식으로 내보낸 데이터베이스를 다운로드했으며 약 700MB의 레코드 (라인 당 1 개)를 가지고 있습니다. 데이터를 MySQL 데이터베이스로 가져 오기 위해 스크립트를 만들었지 만 약 4 백만 개의 레코드가 삽입되면 브라우저가 충돌합니다. 나는 Firefox와 IE에서 테스트했습니다. 누군가 나에게 이것에 대한 의견과 조언을 줄 수 있습니까?

스크립트는 다음과 같습니다.

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
도움이 되었습니까?

해결책

파일을 100MB 청크로 분할 해보십시오. 이것은 작업을 완료하기위한 빠른 해결 제안입니다. 브라우저 문제는 해결하기가 복잡해질 수 있습니다. 다른 브라우저도 시도하십시오.

Phpmyadmin에는 충돌이 발생하면 쿼리를 계속할 수있는 옵션이 있습니다. 스크립트가 시간 제한에 가깝다 고 감지하는 경우에 가져 오기를 인터럽트 할 수 있습니다. 이것은 큰 파일을 가져 오는 좋은 방법이지만 거래를 중단 할 수 있습니다.

다른 팁

MySQL에 레코드를 삽입하려면 왜 웹 브라우저가 필요한지 잘 모르겠습니다. 데이터베이스 자체의 가져 오기 시설을 사용하고 웹을 남겨 두는 것이 어떻습니까?

그것이 불가능하다면, 삽입물을 한 번에 1000 그룹으로 청킹하는 것이 도움이 될지 궁금합니다. 전체 데이터베이스를 단일 트랜잭션으로 커밋하는 대신 해체하는 것이 좋습니다.

innodb를 사용하고 있습니까?

  1. 내가 처음 알아 차린 것은 Flush ()가 안전하지 않다는 것입니다. httpd 버퍼가 완전한 경우 플러시 ()를 수행하면 오류가 발생하고 스크립트가 죽습니다. 이 모든 myflush () 해결 방법을 포기하고 단일을 사용하십시오. ob_implicit_flush() 대신에.

  2. 끝까지 작동하기 위해 브라우저로 볼 필요가 없습니다. INGORE_USER_ABORT() 따라서 브라우저가 죽어도 코드가 작업을 완료해야합니다.

  3. 브라우저가 왜 죽어 가는지 잘 모르겠습니다. 스크립트가 너무 많은 콘텐츠를 생성 할 수 있습니다.

아니오로 시도하십시오

u003Cbr>일시 중지 : Nnnn

브라우저에 출력하고 도움이되는지 확인하십시오. 단순히 브라우저가 렌더링하도록 요청 된 긴 웹 페이지에서 질식하는 것일 수 있습니다.

또한, PHP 타이밍이 긴 전송 중에 출시됩니까?

또한 잠을자는 데 도움이되지 않습니다 (10) 시간이 걸리는 시간에 추가됩니다.

다른 txt 파일로 파일을 분할하고 파일을 사용하여 프로세스를 다시 만들 수 있습니다. 나는 적어도 그 접근법을 한 번 사용한다는 것을 알고 있습니다.

요청을 완료하는 데 너무 오래 걸리기 때문에 브라우저가 질식하고 있습니다. 이 프로세스가 웹 페이지의 일부 여야하는 이유가 있습니까? 이런 식으로 절대적으로해야한다면 관리 가능한 청크로 데이터를 분할하는 것이 좋습니다.

PHP-CLI를 사용하여 명령 줄에서 코드를 실행하십시오. 이런 식으로, 당신은 장기적인 과정에서 시간을 내지 않을 것입니다. 그러나 상황은 타임 아웃 전 브라우저 충돌입니다 ^^. 쉘 액세스가없는 호스팅 서버에서 실행하려고하면 Crontab을 사용하여 코드를 실행하십시오. 그러나, 당신은 crontab이 한 번만 실행하십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top