제목 | insert_batch 작업 중 memory fatal error | ||
---|---|---|---|
카테고리 | CI 2, 3 | ||
글쓴이 | 마PD | 작성시각 | 2018/01/17 13:12:53 |
|
|||
안녕하세요 이번에 새로 싸이트 만들면서 쿼리문을 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
|
마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미만이라 크게 무리 없어 보입니다. |
2번 추천
과거로 회기하는 1번은 아닌것 같고
3번은 시간 많이 걸립니다.
4번은 배열이 메모리를 잡고 있어서 방법이 없을것 같습니다.