| 제목 | 용량이 큰 txt 파일을 read 해 배열에 넣어서 db에 insert 하고자 합니다. | ||
|---|---|---|---|
| 글쓴이 | 로드덕 | 작성시각 | 2015/05/26 09:41:57 | 
| 
                         | 
                |||
| 
                        질문사항 : 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
                             
                             | 
                    
| 
                             
                                변종원(웅파)
                                /
                                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
                             
                            
                                완성이 되면 소스 정리해서 공유해 보도록 하겠습니다. ...
                             
                         | 
                    
1000건씩 나누어서 처리하는방법만 찾으면 될듯 합니다.