2012-01-09 4 views
0

쿼리 문자열을 통해 전달 된 기준에 따라 XML 피드를 즉시 생성하는 웹 응용 프로그램이 있습니다.CPU 집중 XmlTextWriter

매우 간단한 응용 프로그램입니다. 쿼리 문자열 변수를 읽고이를 사용하여 데이터 (데이터베이스의 캐시 된 데이터)를 적절한 XML 형식으로 포맷합니다.

반환되는 XML 파일의 크기는 약 25MB입니다. 많은 데이터가 있습니다.

XmlTextWriter를 사용하여 XML을 작성한 다음이를 요청자에게 "application/octet-stream"(다운로드 할 수있는 첨부 파일)으로 반환합니다.

질문 : XML을 작성하는 것이 CPU의 100 %를 사용하는 것으로 보이고 내 다른 응용 프로그램에서 문제를 일으키는 것 같습니다.

대형 XML 파일을 작성한 경험이있는 사람이 있습니까? 프로세스의 CPU 사용량을 줄이는 데 도움이되는 정보는 무엇입니까?

코드 샘플은 다음과 같습니다

map.WriteRaw("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
      map.WriteStartElement("rss"); 
      map.WriteAttributeString("version", "2.0"); 
      map.WriteAttributeString("xmlns:g", "http://base.google.com/ns/1.0"); 
      map.WriteStartElement("channel"); 
      map.WriteElementString("link", "http://www.mywebsite.com..."); 

      ProductCollection items = Product.GetCachedSiteProducts(); 
      foreach (Product p in items) 
      { 
map.WriteStartElement("item"); 
........ 
        map.WriteElementString("description", p.Description); 
        map.WriteElementString("g:id", p.SiteSku); 
        map.WriteElementString("g:condition", "new"); 
        map.WriteElementString("g:price", p.Price.ToString() + " USD"); 
............... 

        map.WriteEndElement(); //item    
       } 
      } 
      map.WriteEndElement();//channel  
      map.WriteEndElement();//rss  
      Response.Write(sw.ToString()); 

업데이트 : 내가 .. 더 많은 코드를 게시하라고 사람들 덕분에 내 자신의 질문에 대답하고 좀 더 신중하게 보았을 때, 이것은 쉬운 일이었다.

코드는 "Response.write (map.ToString())"을 사용하여 xml을 출력하고있었습니다. 와우, 그건 비효율적이야. 코드를 업데이트합니다. 모두에게 감사드립니다! 떠오르는

+0

실제로 XMLStream을 빌드하는 데 사용하는 코드를 게시 할 수 있습니까? 거기에는 약간의 소비 문제가있을 수 있습니다. 내 의견으로는 일부 코드를 보지 않고도 알 수는 없습니다. – MethodMan

+0

필요한 셸을 만들 수있는 방법이 있습니까? 값을 입력하십시오. 즉, 시간의 100 %를 다시 작성하지 마십시오. 응답 캐싱을 고려 ​​했습니까? –

+0

우리는 100MB가 넘는 XML 파일을 만들고 100 % CPU를 사용하지 않습니다 ... 그래서 어떻게 든 소스 코드를 보여줄 필요가 있다고 생각합니다 ... – Yahia

답변

3

한 즉시 관심사는 당신이, 왜 여기에 출력 스트림에 직접 다음 출력 스트림에 보내는 첫 번째 기록하지 StringWriter에 작성하는 것처럼이 보이는 Response.Writer(sw.ToString())

입니까?

나는 혼자서 CPU 사용량에 많은 영향을 미치거나 100 % CPU 사용을 기대하지 않습니다.

높은 CPU 사용의 가장 큰 원인으로 보이는 루프를 반복 할 때 ProductCollection은 무엇입니까? 코드가 올바르게 IEnumerable<Product>이고 제품 JIT를 얻는 경우 일부 영구 저장소에 대한 제품을 얻는 경우 많은 CPU 사용이 발생할 수 있습니다 (예 : 각 반복에는 몇 가지 독립적 인 데이터베이스 호출이 필요함)

추가 소스 코드를 보지 않고도 무엇이 문제의 원인인지 말할 수 있습니다.

+0

당신이 쓴대로 나는 내 질문을 업데이 트했다 :) 사실, 이것은 내가 생각 해낸 대답이기도하다. productcollection에 대한 제안을 살펴볼 것입니다. 컬렉션은 실제로 캐시에서 가져오고 각 제품에 대한 독립적 인 데이터베이스 호출을 작성하지는 않지만 이러한 작업도 살펴 보겠습니다. 감사! – Rebecca