CI 묻고 답하기

제목 insert_batch 작업 중 memory fatal error
카테고리 CI 2, 3
글쓴이 마PD 작성시각 2018/01/17 13:12:53
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 13368   RSS

안녕하세요

이번에 새로 싸이트 만들면서 쿼리문을 ci에서 지원해주는 방식으로 만들어보고 있습니다.

(쿼리 빌더 클래스??)

생소하지만 이렇게 버릇을 들여놔야 좋을거 같아서요 ㅎㅎ

 

그러던 중 조금 많은... insert 작업이 있습니다.

경우에 따라 다르지만 현재는 20만건 정도..

차후에는 50만건, 100만건으로 늘어날수도 있습니다.

 

각 컬럼에 맞게끔 배열을 만들고 해당 배열을 insert_batch 로 집어넣는 작업을 하고 있었는데요.

오늘 처음으로 메모리 fatal 에러가 나왔습니다.

php.ini 에는 메모리 제한을 512M 으로 해둔 상태인데 이걸 넘겼다고 나오네요.

100만건을 넣든, 200만건을 넣든 512M을 초과한다는거 자체만으로도 쫌 문제가 되는데요 ...

 

과거에는 텍스트로 쿼리문을 만들고 db->query() 로 처리 했기 때문에 쿼리문을 분할해서 만들고 돌리는 방법을 썼었는데...

이번에도 그렇게 해야할까요?

이렇게 다량의 데이터를 insert 할때는 어떻게 하는게 좋을까요?

 

 

생각중인 방법들...

 

1. 과거처럼 문자열로 된 query문을 만들고 적당히 잘라서 한번씩 실행시킨다.

2. 반복문을 돌면서 insert_batch에서 쓸 배열을 만들고 있는데, 적당히 반복돌면 중간에 insert_batch 돌리고 배열을 초기화한 후 다시 반복문을 돌린다.

3. 단순 insert문으로 변경하고 반복문을 돌때마다 insert 시킨다.

4. 혹시 insert_batch 관련해서 메모리나 캐시를 초기화 시키는 방법이 있어서 중간중간 초기화하여 메모리부담을 줄일 수 있는 방법이 있는지??

 다음글 Live Host 에서 database.php 설정방법... (12)
 이전글 파일업로드에서 config설정에 대해 도움을 얻고자합니... (3)

댓글

한대승(불의회상) / 2018/01/17 13:16:09 / 추천 0

2번 추천

과거로 회기하는 1번은 아닌것 같고

3번은 시간 많이 걸립니다.

4번은 배열이 메모리를 잡고 있어서 방법이 없을것 같습니다.

마PD / 2018/01/17 13:57:38 / 추천 0

@한대승

헉. 빠른 답변 감사합니다.

넵 2번 방법으로 시도해보겠습니다 감사합니다!

kaido / 2018/01/17 14:15:05 / 추천 0

insert_batch 에 대해서 추가 설명을 하자면...

 

100개를 한번에 배열에 쌓아두고 쿼리를 실행하냐와 일반 insert 는 쿼리를 1개 단위로 실행하냐의 차이입니다.

insert_batch 가 대단한 무언가를 가진 기능은 아닌 그저 여러개 배열에 저장하고 한번에 실행 한다는 수준이라서 말이죠.

 

요약하면 1개단위로 DB에 쿼리를 실행을 하지 않고 쌓아두고 한꺼번에 쿼리를 실행하면 그게 insert_batch 기능.

다만 빽엔드에서 돌아가는 구조도 사실 1쿼리 단위로 끊어서 실행 했던걸로 기억합니다.

 

즉 2번과 3번은 큰 차이가 없지 않나 싶긴한데... 한번 테스트 해봐야겠네요.

한대승(불의회상) / 2018/01/17 18:04:35 / 추천 0
mysql 기준으로 생성되는 insert 쿼리가 달라집니다.
마PD / 2018/01/17 21:35:55 / 추천 0

과거 1번 방법으로 할때는..

insert into `테이블` values ('1번값'),('2번값'),('3번값'),('4번값')

이런식으로 문자열을 만들고 일정 횟수 이상 쌓이면 작동하게끔 했었는데...

insert_batch 도 이런 쿼리문을 만드는걸까요?

일단 1천번 반복문 돌면 실행시키고 배열을 초기화 시킨 후 다시 쌓도록 내용을 변경했습니다.

결과는 내일 댓글로 남기겠습니다. 조언 감사합니다. :)

마PD / 2018/01/18 12:02:58 / 추천 0

몽땅 insert_batch 로 때려박는 방식에서,

배열을 만드는 반복문이 1천번 돌때마다 입력하고 배열 초기화 후 다시 입력하는 방법으로 변경했습니다.

결과론적으로 속도에 있어서 큰 차이는 없었습니다 :)

메모리는 과거 512M을 초과하는 것으로 나와 오류를 뿜뿜하였지만, 현재 1천건에 따른 예상 데이터 사용량은 30M미만이라 크게 무리 없어 보입니다.