cURL에서 웹 페이지를 빨리 다운 받는 팁이 있을까요?
간단하게 libcurl을 이용해서 rss 구독기를 제작 중 입니다.
일단 주소대로 페이지를 하나씩 읽어온 다음,
하나씩 파싱한 후 파싱한 정보를 한대로 묶어서 리스트를 만들고 보여주는 식인데..
리스트가 적으면 상관없지만 구독할 리스트가 많아지면 많아질수록 읽어 오는 속도가 상당히 느리더군요,
(전체적으로 느린 것 보다 초기 화면에 뜨는 속도가 느립니다....)
다른 구독기랑 비교해봤는데 yarssr도 일일이 읽어오는지 많아질수록 느려지더라고요.
하지만 akregator는 피드를 한꺼번에 읽어온 다음 한꺼번에 파싱하는지 상당히 빠른 속도를 보이더군요.
(아니면 사용하는 라이브러리가 달라서 그런지도 모르겠습니다.)
그래서 질문드리는데 웹 문서를 대량으로 한꺼번에 읽어오는 방식이나
빠르게 문서를 읽어오는 라이브러리를 아시면 조언 좀 해주시면 감사하겠습니다.
아래는 제 소스 중 웹에서 소스 긁어 오는 함수인데 어떻게 수정하면 좀 더 빠를 수 있을까요?(c 소스)
RSS_FEED* url_get_xml(gchar* url)
{
CURL *curl_handle;
RSS_FEED* rss;
BUFFER chunk;
chunk.memory = g_malloc(1);
chunk.size = 0;
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_memory_callback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
puts("읽어오기 시작!");
curl_easy_perform(curl_handle);
curl_easy_cleanup(curl_handle);
puts("읽어오기 완료!");
rss = xml_parser(chunk.memory, chunk.size+1); // 읽어온 걸 파싱함
xmlCleanupParser();
xmlMemoryDump();
if(chunk.memory)
free(chunk.memory);
return rss;
}
소극적인 방법으로는
소극적인 방법으로는 curl_easy_setopt()에 CURLOPT_TCP_NODELAY 옵션을 줘서 nagle algorithm을 끄는 방법을 쓸 수 있을 것이고,
적극적인 방법으로는 fetch를 할 스레드와 parsing을 할 스레드를 분리하고 개별적으로 처리하도록 하는 방법을 쓰는게 좋을 것입니다.
쓰레드를 분리하는 방법이 있었군요.
ibm developworks에서 비슷한걸 슬쩍 봤었는데 지금 써봐야겠습니다.
답변 감사합니다!
curl 의 multi 핸들
아무래도 여러개를 읽어야한다면 multi 핸들을 써서 curl 을 구현하시고 (소켓 select 개념입니다)
그 다음에 스레드를 생각해보시는게 좋겠죠
댓글 달기