개발 Q&A

제목 용량이 큰 txt 파일을 read 해 배열에 넣어서 db에 insert 하고자 합니다.
글쓴이 로드덕 작성시각 2015/05/26 09:41:57
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 18167   RSS
질문사항 :
de.txt 는 도로명 주소 입니다. (데이터크기가 21메가 정도 됩니다.)
아 처리 했을경우 아래의 이미지와 같은 메세지가 나옵니다.
구글링을 해본결과 메모리 문제 때문이라고 하여 php.ini 파일 설정을 변경하였습니다.
memory_limit = 512M

하지만 같은 메세지가 나오는걸로 봐서 다른 분제 인것 같은데... 어느부분을 체크해야할지
어떻게 처리해야할지 조언 부탁드립니다.

ps: txt 파일을 fgets을 이용해 전부 읽지 않고 1000줄씩 나누어서 읽을수는 없나요?

 
$i=0;
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen($DOCUMENT_ROOT.'/de.txt','r');
if ($fp) {
  while (!feof($fp)) {
        $buffer[$i] = fgets($fp, 1024);
        $buffer[$i] = iconv("euc-kr","utf-8",$buffer[$i]);
        echo  $buffer[$i].'<br>';
        ++$i;                     

  }

}
fclose($fp);
 다음글 mysql 쿼리 문 질문합니다. (1)
 이전글 header 영역 title에 관힌 질문입니다. (2)

댓글

로드덕 / 2015/05/26 10:14:24 / 추천 0
데이터 크기를 줄여서 처리해보니 그때는 정상 처리 되네요...
1000건씩 나누어서 처리하는방법만 찾으면 될듯 합니다.
변종원(웅파) / 2015/05/26 10:18:39 / 추천 0
1000건씩 나눠서 읽기만 하는건 현재와 똑같은 메모리를 사용합니다.

21메가를 다 읽어서 메모리에 적재하고 fclose 하기전까지는 날라가지 않습니다.

http://php.net/manual/en/function.ini-set.php 이 명령어로 해당 작업에만 메모리제한 없이 작업을 할 수 있습니다.
한대승(불의회상) / 2015/05/26 12:22:33 / 추천 0
while 루프안에 DB 관련 로직을 집어 넣으면 배열에 집어 넣지 않고도 처리가 가능 할 텐데...
유마 / 2015/05/26 13:45:06 / 추천 0
우편번호 검색은 다음(Daum)걸 이용하는... -_-
로드덕 / 2015/05/26 14:15:49 / 추천 0
/웅파 님 ㅜㅜ 시도해 보았으나 실패 ㅜㅜ 같은 메세지가 나오네요 ㅜㅜ

/불의회상 님 배열에 집어 넣지 않고도 처리 가능하다는게 모든 array 값을 2차 배열로 지정후 한번에 insert 하라는 거죠? 방법을 찾아보도록 하겠습니다. 감사합니다.

/유마 님  담변은 감사하나...   우편번호 검색이 주 목적이 아니라 대용량 데이터를(엑셀파일이 아닌 txt 파일로(|) 로구분...) ci를 이용해서 import(db에 insert)시키는 구문을 작성해 보고자 하는것 입니다.^^ 기본 베이스가 되는것을 하나 만들어두면 두고 두고 쓸수 있을듯 하여 시도해보는중 입니다. ^^ 신경써주셔서 감사합니다.^^
 
한대승(불의회상) / 2015/05/26 14:39:48 / 추천 0
너무 어렵게 이야기 했나요?
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
$fp = fopen($DOCUMENT_ROOT.'/de.txt','r');
if ($fp) {
  while (!feof($fp)) {
        $buffer = fgets($fp, 1024);
        $buffer = iconv("euc-kr","utf-8",$buffer[$i]);
 .
 .

        $this->db->insert('mytable', $data);
  }
}
fclose($fp);
로드덕 / 2015/05/26 14:50:52 / 추천 0
/불의회상 님 감사합니다. 문제는 해결하였고... txt 파일 용량이 100 메가가 넘어서 insert 되다가 중간에 멈추는 문제까지 발생하였습니다만 구글링의 힘으로 결국 찾았네요... 아래의 소스는 구현된 소스 이구요.. 더 심플하게 바꿀 방법을 생각해봐야겟네요... ^^
function get($id){            
            
            $loop=100;
            $pointer=false;
            if ($id!='aaa'){                

                $pointer = $id;
            }
            $q=1;
            $i=0;
            $a=array();
            $buffer=array();
            $DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];
            echo 'start';
           //$fp = fopen($DOCUMENT_ROOT.'/de.txt','r');
            $fp = fopen($DOCUMENT_ROOT.'/seoul.txt','r');

            if($pointer){

                fseek($fp,$pointer);
            }

            if ($fp) {
                 while (!feof($fp)) {
                    $buffer[$i] = fgets($fp, 4096);
                    $buffer[$i] = iconv("euc-kr","utf-8",$buffer[$i]);
                    $a = explode('|',$buffer[$i]);
                     
                    $court_code             = $a[0];
                    $si_do                  = $a[1];
                    $si_gun_gu              = $a[2];
                    $court_eup_myeon_dong   = $a[3];
                    $court_ri               = $a[4];
                    $san                    = $a[5];
                    $ji_no01                = $a[6];
                    $ji_no02                = $a[7];
                    $road_code              = $a[8];
                    $road_name              = $a[9];
                    $basement               = $a[10];
                    $building_no01          = $a[11];
                    $building_no02          = $a[12];
                    $building_name01        = $a[13];
                    $building_name02        = $a[14];
                    $building_code          = $a[15];
                    $eup_myeon_dong_code    = $a[16];
                    $haengieong_dong_code   = $a[17];
                    $haengieong_dong_name   = $a[18];
                    $post01                 = $a[19];
                    $post02                 = $a[20];
                    $delivery_name          = $a[21];
                    $move_cause_code        = $a[22];
                    $redate                 = $a[23];
                    $old_road_name_address  = $a[24];
                    $si_gun_gu_building_name= $a[25];
                    $apartment_house        = $a[26];
                    $zone_code              = $a[27];
                    $address_more           = $a[28];
                    $etc01                  = $a[29];
                    $etc02                  = $a[30];                     
                     
                    ++$i;
                    
                   


                    $this->db->insert('address00',array(
                        
                        'court_code'=>$court_code,
                        'si_do'=>$si_do,
                        'si_gun_gu'=>$si_gun_gu,
                        'court_eup_myeon_dong'=>$court_eup_myeon_dong,
                        'court_ri'=>$court_ri,
                        'san'=>$san,
                        'ji_no01'=>$ji_no01,
                        'ji_no02'=>$ji_no02,
                        'road_code'=>$road_code,
                        'road_name'=>$road_name,
                        'basement'=>$basement,
                        'building_no01'=>$building_no01,
                        'building_no02'=>$building_no02,
                        'building_name01'=>$building_name01,
                        'building_name02'=>$building_name02, 
                        'building_code'=>$building_code,                       
                        'eup_myeon_dong_code'=>$eup_myeon_dong_code,
                        'haengieong_dong_code'=>$haengieong_dong_code,
                        'haengieong_dong_name'=>$haengieong_dong_name,
                        'post01'=>$post01,
                        'post02'=>$post02,
                        'delivery_name'=>$delivery_name,
                        'move_cause_code'=>$move_cause_code,
                        'redate'=>$redate,
                        'old_road_name_address'=>$old_road_name_address,
                        'si_gun_gu_building_name'=>$si_gun_gu_building_name,
                        'apartment_house'=>$apartment_house,
                        'zone_code'=>$zone_code,
                        'address_more'=>$address_more,
                        'etc01'=>$etc01,
                        'etc02'=>$etc02
                    ));

                    $this->db->insert_id();

                    if($q ==$loop){

                        $pointer_here = ftell($fp);
                        $url ='/index.php/topic/address/get/'.$pointer_here;
                        echo '<meta http-equiv="refresh" content="1; url=',$url,'">';
                        fclose($fp);
                        exit;
                    }
                    ++$q;                   


                 }
                 
            }
            
            
            

            echo '파일처리 완료';
            fclose($fp);
           


    }
로드덕 / 2015/05/26 14:52:37 / 추천 0
완성이 되면 소스 정리해서 공유해 보도록 하겠습니다. ...