it-swarm-ko.tech

Xml 또는 Sqlite, 데이터베이스에 대한 Xml을 언제 삭제합니까?

데이터 저장을 위해 Xml을 정말 좋아하지만 언제 sqlite/database가 더 나은 옵션이됩니까? 예를 들어, xml에 x 항목보다 크거나 y MB보다 큰 경우?

RSS 리더를 코딩 중이며 sqlite 데이터베이스에서 xml을 사용하여 all 피드 항목의 캐시를 저장하는 데 잘못 선택했다고 생각합니다. 한 달 후 ~ 1mb의 xml 파일을 가진 일부 피드가 있으며 다른 피드는 700 개가 넘는 항목을 가지고 있지만 대부분은 ~ 30 개의 항목 만 있고 여러 개월 후에는 크기가 50kb입니다.

현재 모든 것을 검색 할 수 있기 때문에 캡을 구현할 계획이 없습니다.

그래서 내 질문은 다음과 같습니다.

  1. Sqlite/데이터베이스의 오버 헤드는 언제 XML을 사용하여 정당화됩니까?
  2. 많은 작은 것들이있을 때 큰 XML 파일이 거의 없음 타당성이 충분한가? (긴 long 시간)

업데이트 됨 (추가 정보)

GUI에서 피드를 선택할 때마다 해당 피드 xml 파일에서 모든 항목을 다시로드합니다.

또한 XML의 모든 노드를 반복하여 항목을 찾은 다음 읽거나 읽지 않도록 설정할 때 실제로 해킹 된 읽기/읽지 않은 상태를 수정해야합니다.

49
sieben

나는 기본적으로 Mitchel 에 동의하는데, 이것은 XML/sqlite로 무엇을 할 것인지에 따라 매우 구체적 일 수 있다는 것입니다. 귀하의 경우 (캐시), sqlite (또는 다른 임베디드 DB)를 사용하는 것이 더 합리적입니다.

먼저 sqlite가 XML보다 더 많은 오버 헤드가 필요하다고 생각하지 않습니다. 그리고 개발 시간 오버 헤드와 런타임 오버 헤드를 모두 의미합니다. 유일한 문제는 sqlite 라이브러리에 의존한다는 것입니다. 그러나 XML 용 라이브러리가 필요하기 때문에 중요하지 않습니다 (프로젝트가 C/C++에 있다고 가정).

xml보다 sqlite의 장점 :

  • 하나의 파일에있는 모든 것
  • 캐시가 커질수록 성능 손실은 XML보다 낮습니다.
  • 피드 메타 데이터를 캐시 자체 (다른 테이블)와 분리 할 수 ​​있지만 동일한 방식으로 액세스 할 수 있습니다.
  • SQL은 대부분의 사람들에게 XPath보다 작업하기가 더 쉽습니다.

sqlite의 단점 :

  • 동일한 데이터베이스에 액세스하는 여러 프로세스에서 문제가 될 수 있습니다 (아마도 귀하의 경우는 아님).
  • 최소한 기본 SQL을 알아야합니다. 캐시에 수십만 개의 항목이 없다면, 많이 최적화 할 필요는 없다고 생각합니다.
  • 어쨌든 보안 관점에서 더 위험 할 수 있습니다 (SQL 주입). 반면에 웹 앱을 코딩하지 않으므로 이런 일이 발생하지 않아야합니다.

다른 해결책은 아마도 두 솔루션 모두에 필적합니다.

요약하면 귀하의 질문에 각각 답변하십시오.

  1. 두 백엔드로 특정 응용 프로그램을 테스트하지 않으면 알 수 없습니다. 그렇지 않으면 항상 추측 일뿐입니다. 두 캐시에 대한 기본 지원은 코딩에 문제가되어서는 안됩니다. 그런 다음 벤치마킹하고 비교하십시오.

  2. XML 파일이 구성되는 방식으로 인해 sqlite 검색은 항상 더 빨라야합니다 (매우 빠르기 때문에 중요하지 않은 일부 경우는 제외). XML 검색 속도를 높이려면 어쨌든 인덱스 데이터베이스가 필요합니다. 그러나 sqlite를 사용하면 데이터베이스의 일부로 색인을 생성 할 수 있습니다.

21
Stan

남자는 이것에 대해 경험이 있습니까? XML을 사용하여 모든 데이터를 원래 저장 한 다음 sqlite로 옮긴 프로젝트에서 작업합니다. 각 기술에는 많은 장단점이 있지만 성능이 전환의 원인이었습니다. 여기 우리가 관찰 한 것이 있습니다.

소규모 데이터베이스 (몇 메가 이하)의 경우 XML이 훨씬 빠르고 처리하기가 더 쉽습니다. 우리의 데이터는 자연스럽게 트리 형식으로되어있어 XML을 훨씬 더 매력적으로 만들었으며 XPATH를 사용하면 조상 트리를 걸지 않고 한 줄로 많은 쿼리를 수행 할 수있었습니다.

우리는 Win32 환경에서 프로그래밍하고 표준 Microsoft DOM 라이브러리를 사용했습니다. 모든 데이터를 메모리에로드하고 DOM 트리로 구문 분석 한 후 메모리 사본을 검색, 추가, 수정합니다. 주기적으로 데이터를 저장하고 쓰기 도중에 시스템이 중단 된 경우 사본을 회전해야했습니다.

또한 C++ 트리 맵을 사용하여 일부 "인덱스"를 직접 작성해야했습니다. 물론 이것은 sql과 관련이 없습니다.

파일 시스템의 데이터 크기는 "메모리 내"돔 트리보다 2 ~ 4 배 작습니다.

데이터가 10M-100M 크기에 도달 할 때, 우리는 실제 문제가 발생하기 시작했습니다. 흥미롭게도 모든 데이터 크기에서 XML 처리는 sqlite보다 훨씬 빠릅니다 (하드 드라이브가 아닌 메모리에 있기 때문에)! 문제는 실제로 두 배가되었으며로드 시간이 길어지기 시작했습니다. 데이터가 메모리에 있고 맵이 작성되기 전에 1 분 정도 기다려야합니다. 물론 한번로드 된 프로그램은 매우 빠르다. 두 번째 문제는이 모든 기억이 항상 묶여 있다는 것이었다. 수백 meg 만있는 시스템은 매우 빠르게 실행되지만 다른 앱에서는 응답하지 않습니다.

실제로 파일 시스템 기반 xml 데이터베이스를 사용하려고합니다. 몇 가지 오픈 소스 버전 xml 데이터베이스가 있으며 시도했습니다. 상용 XML 데이터베이스를 사용하려고 시도한 적이 없으므로 이에 대해 언급 할 수 없습니다. 불행히도 우리는 xml 데이터베이스를 전혀 제대로 작동시키지 못했습니다. 수백 메가의 XML로 데이터베이스를 채우는 데에도 몇 시간이 걸렸습니다 ... 아마 잘못 사용했을 것입니다. 또 다른 문제는이 데이터베이스가 상당히 무거웠다는 것입니다. 그들은 Java 필요했고 완전한 클라이언트 서버 아키텍처를 가졌습니다. 우리는이 아이디어를 포기했습니다.

그때 sqlite를 찾았습니다. 그것은 우리의 문제를 해결했지만 가격이 책정되었습니다. 처음 sqlite를 꽂았을 때 메모리와로드 시간 문제가 사라졌습니다. 불행히도 모든 처리가 이제 하드 드라이브에서 수행되었으므로 백그라운드 처리 부하가 증가했습니다. 이전에는 CPU로드를 전혀 감지하지 못했지만 이제 프로세서 사용량이 증가했습니다. 우리는 코드를 최적화해야했지만 여전히 일부 데이터를 메모리에 보관해야했습니다. 또한 많은 간단한 XPATH 쿼리를 복잡한 다중 쿼리 알고리즘으로 다시 작성해야했습니다.

여기 우리가 배운 것에 대한 요약이 있습니다.

  1. 트리 데이터의 경우 XPATH를 사용하여 XML을 훨씬 쉽게 쿼리하고 수정할 수 있습니다.

  2. 소규모 데이터 세트 (10M 미만)의 경우 XML이 성능에서 sqlite를 날려 버렸습니다.

  3. 대용량 데이터 세트 (10M-100M 이상)의 경우 일부 컴퓨터를 사용할 수 없게되는 시점까지 XML로드 시간과 메모리 사용량이 큰 문제가되었습니다.

  4. 대규모 데이터 세트와 관련된 문제를 해결하기 위해 오픈 소스 xml 데이터베이스를 얻을 수 없습니다.

  5. SQLITE에는 XML DOM의 메모리 문제가 없지만 일반적으로 데이터 처리 속도가 느립니다 (메모리가 아닌 하드 드라이브에 있음). (note- sqlite 테이블은 메모리에 저장 될 수 있습니다. 아마도 이것이 빨라질 것입니다 .... 데이터를 메모리에서 꺼내고 싶기 때문에 시도하지 않았습니다.)

  6. 테이블에 트리 데이터를 저장하고 쿼리하는 것은 즐겁지 않습니다. 그러나 트랜잭션 관리 및 인덱싱이 부분적으로 구성됩니다.

38
Jim

파일 시스템 인 여러분의 손끝에 훌륭한 데이터베이스가 있다는 것을 잊지 마십시오!

많은 프로그래머들은 알맞은 디렉토리 파일 구조가 다음과 같다는 것을 잊습니다.

  1. 지옥만큼 빠르다
  2. 휴대용
  3. 런타임 풋 프린트가 작습니다.

사람들은 XML 파일을 여러 XML 파일로 분할하는 것에 대해 이야기하고 있습니다 ... XML을 여러 디렉토리와 여러 일반 텍스트 파일로 분할하는 것을 고려할 것입니다.

가자. 상쾌하게 빠릅니다.

12
Oli
  1. 응용 프로그램이 알아야 할 데이터, 구성, 로깅 및 알 수없는 데이터에 XML을 사용하십시오.
  2. 사용자가 직접 또는 간접적으로 상호 작용하는 데이터에 데이터베이스 (Oracle, SQL Server 등)를 사용하십시오. 실제 데이터
  3. 사용자 데이터가 대량의 파일 목록 및 내용 또는 전자 메일 항목 모음과 같은 직렬화 된 컬렉션에 더 많은 경우 SQLite를 사용하십시오. SQLite는 그 점에 능숙합니다.

데이터의 종류와 크기에 따라 다릅니다.

6
Vin

RSS 항목을 저장하는 데 XML을 사용하지 않습니다. 피드 리더는 데이터를 수신 할 때 지속적으로 업데이트합니다.

XML을 사용하면 먼저 파일에서 데이터를로드하고 구문 분석 한 후 쉽게 검색/검색/업데이트 할 수 있도록 저장해야합니다. 데이터베이스 같은데 ...

또한 응용 프로그램이 충돌하면 어떻게됩니까? XML을 사용하는 경우 XML 파일의 데이터와 메모리의 데이터는 어떤 상태입니까? 최소한 SQLite를 사용하면 원 자성이 생겨서 마지막 데이터베이스 쓰기 시점과 동일한 상태로 응용 프로그램이 시작됩니다.

5
typicalrunt

XML은 응용 프로그램에서 다른 곳으로 데이터를 이동하거나 응용 프로그램간에 정보를 공유해야 할 때 교환 형식으로 사용하는 것이 가장 좋습니다. 데이터베이스는 거의 모든 규모의 응용 프로그램에 적합한 기본 저장소 방법이어야합니다.

5
Bradley Harris

데이터베이스 대신 데이터 지속성을 위해 XML을 언제 사용해야합니까? 거의 없다. XML은 데이터 전송 언어입니다. 구문 분석이 느리고 쿼리가 어색합니다. XML을 파싱하고 (파쇄하지 마십시오!) 결과 데이터를 도메인 객체로 변환합니다. 그런 다음 도메인 개체를 유지하십시오. 지속성에 대한 데이터베이스의 주요 장점은 구조화되지 않은 쿼리를 의미하고 일반적인 도구 및 최적화 기술에 대한 액세스를 의미하는 SQL입니다.

4
David Medinets

SQLite로 전환했으며 데이터베이스에 있다는 것을 많이 더 잘 알고 있습니다.

이것으로부터 많은 다른 이점이 있습니다 :

  • 새 항목을 추가하는 것은 정말 간단합니다
  • 여러 열을 기준으로 정렬
  • 고유 인덱스로 중복 제거

읽지 않은 항목 하나와 모든 항목 하나에 대해 2 개의보기를 만들었습니다.이보기가 가장 많이 사용되는지 확실하지 않지만 실제로 사용해보고 싶었습니다.

또한 StopWatch 클래스를 사용하여 xml과 sqlite를 벤치마킹했으며 sqlite는 더 빠르지 만 그렇지만 xml 파일을 구문 분석하는 내 방법이 가장 빠른 방법은 아닐 수도 있습니다.

  1. 작은 # 품목 및 크기 (25 품목, 30kb)
    • ~ 1.5ms sqlite
    • ~ 8.0ms XML
  2. 큰 항목 수 (700 개 항목, 350kb)
    • ~ 20ms 평방
    • ~ 25ms XML
  3. 큰 파일 크기 (850 개 항목, 1024kb)
    • ~ 45ms sqlite
    • ~ 60ms XML
2
sieben

확장이 필요할 때마다 데이터베이스를 사용하십시오.

2
Mostlyharmless

나에게 그것은 실제로 당신이하고있는 일, 동시에 얼마나 많은 사용자/프로세스에 액세스 해야하는지 등에 달려 있습니다.

대용량 XML 파일을 항상 사용하지만 단일 프로세스, 가져 오기 스타일 항목, 다중 사용자 또는 성능이 실제로 필요하지 않습니다.

정말 균형입니다.

2
Mitchel Sellers

XML은 완전히 구조화되지 않은 데이터를 저장하는 데 적합하며 일반적으로 다른 응용 프로그램과 교환하려고합니다. 데이터에 SQL 데이터베이스를 사용하는 것을 선호합니다. 데이터 자체의 오타 나 생략으로 인해 미묘한 오류가 발생할 수 있으므로 XML은 오류가 발생하기 쉽습니다. 일부 오픈 소스 응용 프로그램 프레임 워크는 구성, 데이터 등을 위해 너무 많은 xml 파일을 사용합니다. SQL에서 사용하는 것을 선호합니다.

경험 법칙을 요구하기 때문에 한 번 설정하고 많이 액세스/검색하지 않으면 XML 기반 응용 프로그램 데이터, 구성 등을 사용한다고 말하고 싶습니다. 활발한 검색 및 업데이트의 경우 SQL과 함께 사용하는 것이 가장 좋습니다.

예를 들어, 웹 서버는 응용 프로그램 데이터를 XML 파일로 저장하므로 복잡한 검색을 수행 할 필요가 없습니다. 파일을 업데이트하십시오. 웹 서버가 시작되고 xml 파일을 읽습니다. 따라서 XML은 완벽합니다. Struts와 같은 프레임 워크를 사용한다고 가정하십시오. XML을 사용해야하고 응용 프로그램을 개발하고 배포 한 후에는 작업 구성이 크게 바뀌지 않습니다. XML 파일도 좋은 방법입니다. Struts에서 개발 한 애플리케이션이 광범위한 검색 및 업데이트, 삭제를 허용하는 경우 SQL이 최적의 방법입니다.

물론, 조직 내에서 XML 또는 SQL 만 노래하고 XML 또는 SQL을 유일한 방법으로 선포하는 한두 명의 개발자를 반드시 만나게됩니다. 그러한 사람들을 조심하고 응용 프로그램에 '느낌'을 느끼십시오. 단지 '기술 종교'를 따르지 마십시오.

데이터를 얼마나 자주 업데이트해야하는지, 얼마나 자주 데이터를 검색해야하는지 생각하십시오. 그런 다음 XML 또는 SQL 중 무엇을 사용해야하는지에 대한 답을 얻게됩니다.

2
echarcha

@Bradley에 동의합니다.

XML은 매우 느리고 저장 형식으로 특히 유용하지 않습니다. 왜 귀찮게? 텍스트 편집기를 사용하여 수동으로 데이터를 편집 하시겠습니까? 그렇다면 XML still은 YAML과 비교할 때 매우 편리한 형식이 아닙니다. SQlite와 같은 기능을 사용하면 쿼리를보다 쉽게 ​​작성할 수 있으며 데이터를 가져오고 나가는 데 잘 정의 된 API가 있습니다.

프로그램간에 데이터를 보내야하는 경우 XML이 좋습니다. 그러나 효율성이라는 이름으로 전송 시간에 XML을 생성하고 수신 시간에 "실제 데이터"로 구문 분석해야합니다.

위의 모든 내용은 "데이터베이스의 오버 헤드가 정당화 될 때"에 대한 귀하의 질문은 일종의 무례 함을 의미합니다. XML은 SQlite보다 항상 오버 헤드가 높습니다. (MSSQL과 같은 완전한 데이터베이스는 특히 관리 오버 헤드에서 더 무겁지만 완전히 다른 질문입니다.)

1
apenwarr

XML은 텍스트와 이진 파일 형식으로 저장할 수 있습니다.

컴퓨터가 파일 형식을 효율적으로 읽고 쓰는 것이 주된 목표라면 이진 파일 형식으로 작업해야합니다.

데이터베이스는 사용하기 쉬운 데이터 저장 및 유지 관리 방법입니다. 이진 파일 형식 인 데이터를 저장하는 가장 빠른 방법은 아닙니다.

속도를 높일 수있는 것은 메모리 데이터베이스/데이터베이스 유형을 사용하는 것입니다. Sqlite에는이 옵션이 있습니다.

그리고 이것은 당신을 위해 그것을하는 가장 좋은 방법처럼 들립니다.

1
Mischa Kroon

내 의견은 순수한 텍스트 파일 형식이 필요하지 않을 때마다 SQLite (또는 다른 적절한 내장 데이터베이스)를 사용해야한다는 것입니다. 이것은 매우 큰 예외입니다. 순수한 텍스트 파일 형식을 필요로하거나 그로부터 이익을 얻는 많은 시나리오가 있습니다.

오버 헤드가 발생하는 한 SQLite는 일반 플래그를 사용하여 250k와 같은 것으로 컴파일합니다. 많은 XML 파싱 라이브러리는 SQLite보다 큽니다. XML을 사용하면 동시성이 향상되지 않습니다. SQLite 이진 파일 형식은 훨씬 효율적인 쓰기를 지원할 것입니다. 그리고 심지어 대부분 랜덤 액세스라고 생각하는 데이터를 읽는 것조차 SQLite를 사용하면 더 빠를 것입니다.

그리고 무엇보다도 트랜잭션 및 인덱스와 같은 SQL의 이점에 액세스 할 수 있습니다.

편집 : 언급을 잊어 버렸습니다. 많은 데이터베이스와 달리 SQLite의 한 가지 이점은 모든 열의 모든 행에 모든 유형을 허용한다는 것입니다. 기본적으로 SQLite를 사용하면 데이터 유형 측면에서 XML과 동일한 자유를 얻을 수 있습니다. 이것은 또한 텍스트 열에 제한을 두는 것에 대해 걱정할 필요가 없음을 의미합니다.

1
Jay Stramel

데이터베이스는 프로그램의 일부로 훌륭합니다. 데이터를 퀘스트하는 것이 비즈니스 로직의 일부입니다. 특히 데이터 형식이 다음과 같은 경우 XML이 파일 형식으로 가장 좋습니다.

1, 계층
2, 추측 할 수없는 방식으로 미래에 변경 될 가능성이 있음
3, 데이터가 프로그램보다 오래 지속됩니다

1
Martin Beckett

많은 대형 관계형 DB (Oracle 및 SQLServer)에는 데이터베이스 내에 데이터를 저장하고 SQL 문 내에서 XPath를 사용하여 해당 데이터에 액세스 할 수있는 XML 데이터 유형이 있습니다.

또한 XMLite는 문서 모음을 보유하는 하나의 이진 파일이라는 의미에서 SQLite와 매우 유사하게 작동하는 기본 XML 데이터베이스가 있으며 단일 문서 또는 전체 컬렉션에서 XPath/XQuery를 사용할 수 있습니다. 따라서 XML 데이터베이스를 사용하면 요일 데이터를 컬렉션에 별도의 XML 문서로 저장하는 것과 같은 작업을 수행 할 수 있습니다. 따라서 오늘날의 데이터를 처리 할 때 해당 문서 하나만 사용해야합니다. 그러나 XQuery를 작성하여 해당 개인의 문서 콜렉션에 대한 히스토리 데이터를 찾으십시오. 멋진.

Berkeley XMLDB (현재 Oracle에서 지원)를 사용했습니다. 구글에서 "네이티브 XML 데이터베이스"를 검색하면 다른 것들도 있습니다. 이 방식으로 데이터를 저장/검색하는 데 성능 문제가 발생하지 않았습니다.

XQuery는 다른 짐승이지만 (학습할만한 가치가 있지만) 현재 사용중인 XPath를 약간 수정하여 사용할 수 있습니다.

1
Nika

나는 그것이 데이터 크기의 문제가 아니라 데이터 유형의 문제라고 말합니다. 데이터가 structured 인 경우 관계형 데이터베이스를 사용하십시오. 데이터가 반 구조적 인 경우 XML을 사용하거나 데이터 양이 너무 커지면 XML 데이터베이스를 사용하십시오.

0
Sebastian Redl

검색하면 db로 이동하십시오. xml 파일을 디렉토리로 분할하여 쉽게 찾을 수 있지만 관리 오버 헤드가 쉽게 커집니다. 당신은 또한 SQL DB를 사용하는 것 이상의 성능을 얻습니다 ...

0
Andrew Taylor