개발 Q&A

제목 70만개의 데이타가 있는 XML를 파싱해서 DB에 넣을떄 속도를 올리는 방법 ?
글쓴이 람이 작성시각 2015/12/03 16:25:00
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 14555   RSS
혹시 PHP에서

70만개의 데이타가 있는 XML를 파싱해서 DB에 넣을떄 속도를 올리는 방법 ?

$URL = "데이타 제공사의 XML URL";
simplexml_load_file($URL);

함수를 사용해서 foreach를 돌려 처리하는데 대략 4GB 서버로 약 20시간이 넘게 걸리는데요..

ㅇㅣ 고ㅏㅈㅓㅇ 중에는 if문도 있고 select * 문도 있습니다.

이 방식을 이용하면서 속도를 줄일 수 있는 방법이 있을까요 ?

apache2.4
php 5.6
mysql 5.5

ㅇㅣㅁㅕ 물론 내부 로직에 따라 속도에 영향을 주는 점은 감안하고 질문을 남깁니다.
태그 속도,xml,파싱
 다음글 aws s3와 composer에 대한 질문입니다.
 이전글 테이블 동시 변경 관련 문의드립니다. (3)

댓글

변종원(웅파) / 2015/12/03 16:42:13 / 추천 0
xml이던 json 이던 일단 전체를 읽어야 구조를 변경할 수 있어서 딱히 방법은 없어보입니다.

끊어서 읽을 수 있는 구조라면 모를까 전체를 다 읽어서 변환해야 하는 것이면 빨리 읽어들이는 방법(사양 업그레이드)밖에는... ^^;

파일 읽어서 변환되는데까지 얼마나 걸리는지 체크해보세요. 그게 얼마 안걸리면 로직 개선을 하면 되는거구요.
그게 오래 걸리면 답은 사양 업그레이드나 저장형식 변경밖에 없습니다.
/ 2015/12/03 16:46:08 / 추천 0
저도 비슷한 데이터를 다룬적이 있는데, 항공데이터요..
저도 대략 70만줄의 문자열 html 파싱하는건데요.. 비슷한 경우 같아요..
저는 curl로 html 다운 받고 이후에 배치 큐로 처리했습니다.
본문의 내용을 보면 데이타 제조사 url로 붙어서 작업하는거 같은데,
다운 받고 실행하면 좀 더 빨리 처리되지 않을까요??
작업하면서 알아보니, 이런 작업은 c 나 c++ 현재 관심가지고 있는 rust로 처리하면 빨리 처리될 거 같아요...(이부분은 생각만 가지고 있는거고 직접 해보지 않아서 해보시라고 권유는 못해드려요..)
파싱하면서 데이터를 sql로 저장해서 다 되면 mysqldump 명령어를 이용해서 업데이트 하면 될거 같아요..
부하 문제를 피하기 위해서 배치 큐 서버를 구현했구요.. 분산해서 저장하는 방식으로 처리했어요..
kaido / 2015/12/03 17:04:33 / 추천 0
xml 을 파싱 하지 말고 다운로드 받아서 파일로 읽어서 처리하는 편이 조금 더 속도가 나옵니다.
 
람이 / 2015/12/03 19:00:51 / 추천 0
변종원님, 닉님, kaido님 모두 답변 감사 드립니다.

일단은 저장하고 처리하는 방법을 해 봐야겠네요.

닉님이 말씀 하신 sql로 저장해서 mysqldump로 처리하는 방법은 좀 더 구글링을 해 봐야 할 듯 합니다.

아무튼 답변 주셔서 감사합니다.
들국화 / 2015/12/04 14:51:57 / 추천 0
file load 로 올리세요. 70만건이면 수초안에 끝날거에요.
아니면 제약조건을 끄고 인서트, 자동커밋 끄고 중간중간 커밋, 벌크인서트등 방법은 다양 합니다.
/ 2015/12/08 18:29:25 / 추천 0
@들국화 제가 초보라 답변을 이해하지 못했는데, 파일로드와 벌크인서트 설명부탁해요.