문제

내가 고용 장소에 있었던 몇 년 동안, 나는 내부 데이터를 XML의 큰 문자열로 유지하는 반 패턴을 고려하는 것에 대한 뚜렷한 경향을 발견했습니다. 나는 두 명의 최악의 범죄자가 상당히 비슷했지만 여러 가지 방법으로 여러 가지 방법을 수행하는 것을 보았습니다.

웹 서비스

첫 번째 응용 프로그램 인 웹 서비스는 SQL 데이터베이스 내에서 잠재적으로 많은 양의 데이터에 대한 액세스를 제공합니다. 스타트 업에서는 데이터베이스에서 모든 데이터를 더 많이 가져 와서 메모리에 XML로 저장합니다. (세 번)이 응용 프로그램의 소유자는이를 캐시라고 부릅니다. 이것에 반대하는 동안 실행 된 모든 성적 문제 가이 일에 직접 추적 할 수 있었기 때문에 나는 그것을 느리게 부릅니다. (회사 환경이기 때문에 고객이 서비스가 아닌 Perf Failure에 대해 비난받는 것은 놀라운 일이 아닙니다.)이 응용 프로그램은 XML Dom을 사용합니다.

수입업자

두 번째 응용 프로그램은 타사 데이터베이스에서 내보내기의 결과로 생성 된 XML 파일을 읽습니다. 목표는이 데이터를 독점 시스템 (미국 소유)으로 가져 오는 것입니다. 이를 수행하는 응용 프로그램은 전체 XML 파일을 읽고 전체 가져 오기 시퀀스에 걸쳐 XML 파일의 사본을 최소 2 개 이상 유지합니다. 가져 오기가 이루어지기 전에 데이터를 조작, 변환 및 구성을 수행 할 수 있으므로 수입업자는이 데이터를 전체 수명을 위해 XML 형식으로 소유합니다. 의심 할 여지없이,이 수입업자는 중간 크기의 XML 파일이 제공되면 폭발합니다. 이 응용 프로그램은 사본 중 하나에 XML dom 만 사용하고 나머지는 모두 원시 XML 문자열입니다.

상식에 대한 나의 이해는 XML이라는 것을 암시합니다 ~ 아니다 메모리 내 데이터를 보유하기위한 좋은 형식이지만, 데이터는 출력/전송 및 내부 데이터 구조로 변환 될 때 XML로 변환되어야합니다. 문제는 확장 성 문제를 완전히 무시하는 생산 코드에 끊임없이 참여하고 그렇게하기위한 추가 노력. (이 응용 프로그램에서 구문 분석의 엄격한 양이 무섭습니다.)

이것은 다른 사람들이 알로스에 달하는 작업에 적합한 도구를 적용하지 못하는 일반적인 실패입니까? 아니면 내 입장에서 불운입니까? 아니면 맹목적으로 명백한 것을 놓치고 있습니까? 좋은 XML로 많은 양의 데이터를 저장하는 것이 옳고 괜찮은 상황입니까?

도움이 되었습니까?

해결책

메모리에 저장된 데이터는 클래스에 있어야합니다. 우리가 말하는 데이터의 양이 많을수록 더 중요합니다. XML은 성능을 줄이는 매우 부풀어 오른 형식입니다. XML은 응용 프로그램 간 데이터를 전송하는 데만 사용해야합니다. IMHO.

다른 팁

아니, 동의합니다. 첫 번째 예를 들어, 데이터베이스는 거의 모든 캐싱을 처리해야하므로 모든 데이터를 프로그램 메모리에 저장하는 것이 잘못되었습니다. 이는 XML로서 메모리에 저장되어 있는지 여부를 적용합니다.

두 번째로 XML을 가능한 한 빨리 유용한 표현으로 변환 한 다음 아마도 그런 식으로 작업해야합니다. 소량의 데이터 인 경우에만 XMLDocument (예 : XPath 사용)로 모든 메모리 작업을 수행하는 것이 적절합니다. 문자열 구문 분석은 매우 드물게 사용해야합니다.

@Matthew Flaschen은 좋은 지적을합니다. 기존 프로젝트에 가입하면 동의하지 않는 디자인 및 구현 결정을 찾을 수 있다고 덧붙입니다.

우리 모두는 항상 새로운 것을 배우고 모두 실수를합니다. 이것이 "DUH"종류의 문제처럼 보이지만 다른 개발자들이 캐시의 개념을 통해 코드를 최적화하려고 노력했다고 확신합니다.

요점은 때때로 사람들, 특히 개발자가 자신의 길을 바꾸도록 설득하기 위해 부드러운 접근법이 필요하다는 것입니다. 이것은 코딩 문제가 아니라 사람들 문제입니다. 당신은 이러한 개발자들이 당신이 제안하는 이러한 변화가 그들이 무능하다는 것을 암시하지 않음을 확신시키는 방법을 찾아야합니다.

캐싱은 좋은 아이디어가 될 수 있지만 기능 속도를 높이기 위해 노력하고 싶습니다. 이전 방법과 비교하여 (더 논리적) 구현이 어떻게 작동하는지에 대한 빠른 데모를 만듭니다. 극적인 속도 개선으로 논쟁하기는 어렵습니다. 대화에서 구현 한 방식을 직접 공격하는 데주의하십시오. 이 사람들이 당신과 함께 일할 필요가 있습니다.

행운을 빕니다!

나는 또한 동의하며, 불운의 요소가 있다고 생각합니다.

...하지만 빨대를 잡는 것은 XML로 저장되는 데이터를 볼 수있는 유일한 용도는 자동화 된 단위 테스트를위한 것입니다. 여기서 XML은 테스트 데이터를 쉽게 조정하는 방법을 제공합니다. 그래도 그만한 가치가 없습니다.

레거시 COM 객체와 상호 작용하기 위해해야한다는 것을 알았습니다. COM 객체는 XML 또는 클래스를 사용할 수 있습니다. 클래스의 각 구성원을 채우는 Interop 오버 헤드는 너무 커서 XML을 처리하는 것이 훨씬 빠른 대안이었습니다. 우리는 AC# 클래스를 COM 클래스와 동일하게 만들 수 있었지만 기간 동안 너무 어려웠습니다. 그래서 xml이었다. 그것은 좋은 디자인 결정이 될 것이 아니라, 거대한 데이터 구조를 위해 Interop을 다룰 때, 우리가 할 수있는 가장 빠른 일이었습니다.

C# 측에서 LinqToxML을 사용하고 있다고 말해야하므로 작업하기가 약간 쉬워집니다.

OOP 및 데이터베이스는 어떻습니까? XML에는 용도가 있지만 모든 것을 사용하는 데 문제가있을 수 있습니다.

데이터베이스는 데이터 액세스 속도를 높이는 인덱싱, 트랜잭션 등을 허용 할 수 있습니다.

객체는 대부분의 경우 작업하기가 더 쉽고 도메인 등의 더 나은 그림을 제공합니다.

나는 XML을 사용하는 것에 반대하지는 않지만 패턴과 같다. 그들은 우리가 어디에서 그리고 언제 어디서 사용해야하는지 이해해야하는 도구이다.

그렉,

여러 응용 프로그램에서 나는 당신이 설명하는 패턴을 다소 정확하게 따릅니다.

편집 : 스크래치가 없습니다. XML을 문자열 (또는 다중 문자열)으로 저장하지 않았습니다. 나는 방금 그것을 DOM으로 구문 분석하고 그것과 함께 일했습니다. 도움이되었습니다.

XML 소스를 DOM (Microsoft Parser)으로 가져 와서 필요한 모든 처리를 위해 유지했습니다. 나는 DOM 원인의 메모리 오버 헤드를 잘 알고 있지만 그럼에도 불구하고 Apporach가 매우 유용하다는 것을 알았습니다.

  • 처리 중 일부 점검에는 데이터에 대한 임의의 액세스가 필요합니다. SelectPath 문은이 목적을 위해 상당히 잘 작동합니다.

  • DOM 노드는 응용 프로그램에서 인수로 앞뒤로 전달 될 수 있습니다. 대안은 모든 단일 유형의 객체를 래핑하고 XML 스키마가 진화함에 따라 클래스를 작성하는 것입니다. 다형성에 대한 가난한 (VB6/VBA) 남자의 접근법입니다.

  • DOM의 전부 또는 일부에 XSLT 변환을 적용하는 것은 스냅입니다.

  • 파일 I/O는 DOM에 의해 처리됩니다 (xmldoc.save ...)

링크 된 객체 목록은 비슷한 양의 메모리를 소비하고 더 많은 코드가 필요합니다. 모든 검색 및 I/O 기능은 직접 코딩해야합니다.

내가 반포 팬으로 인식 한 것은 실제로 XML이 구조의 배열로 다소 수동으로 구문 분석 된 응용 프로그램의 이전 버전입니다.

높은 볼륨의 데이터의 경우 답변은 아니오입니다. 메모리의 XML 문자열로 데이터를 직접 저장 해야하는 이유는 없습니다.

그러나 여기에 흥미로운 것이 있습니다 프레젠테이션, Alex Brown, XML을보다 효율적으로 보존하는 방법. '냉동 스트림'으로.

이 비디오와 XML Prague 2009에 제공된 기타 프레젠테이션도 있습니다. 여기.

링크 텍스트

일반적으로 XML의 직렬화와 무관 한 내부 데이터 모델을 사용하려고합니다.

그러나 내 생각에 내부 데이터 구조로 XML을 사용하는 경우가 있습니다.: 데이터 모델이 타사가 형식을 확장 할 수있는 계층 적 관계를 캡처 해야하는 경우, 확장 정보를 유지하면서 응용 프로그램 이이 데이터를 전달 해야하는 경우.

예를 들어, Lumberjack 로깅 프레임 워크: 아이디어는 모든 응용 프로그램이 이벤트 (경고, 오류 등)에 대한 계층 적 정보를 제공 할 수있는 XML 기반 이벤트 데이터 모델을 갖는 것입니다. 프레임 워크는 이벤트를 수집하고 적절한 핸들러에 배포하는 것을 관리합니다. 제 3자는 형식에 자체 추가를 쉽게 정의하고 적절한 생성기 및 핸들러를 제공 할 수 있습니다.

여기서 중요한 부분은 프레임 워크가 생성기에서 핸들러로 온전한 모든 XML 정보를 사용하여 XML을 전달해야한다는 것입니다. 이 경우 필요한 모든 정보를 캡처하는 내부 데이터 구조를 구현하면 대부분의 XML 자체가 재 구현됩니다. 따라서 내부 데이터 표현에 적절한 DOM 프레임 워크를 사용하는 것이 의미가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top