2011-02-27 2 views
7

델파이에서 거대한 텍스트 파일 데이터를로드하는 가장 좋은 방법은 무엇입니까? 텍스트 파일을로드 할 수있는 구성 요소가 있습니까?TStringList를 사용하여 거대한 텍스트 파일을 Delphi에서 가장 좋은 방법으로로드하고 있습니까?

텍스트 파일에 데이터베이스가 들어 있고 고정 길이 형식으로 저장되어 있다고 가정 해 보겠습니다. 각 필드에는 적어도 50 자 이상의 150 개의 필드가 있습니다. 내가 TStringList.loadFromFile 방법을 사용하는 경우 1. 충분히인가 : 1. I 메모리 나는 그것을 분석하고 아마

내 질문을 처리하는 memdataset에 저장해야하는 2에로드해야합니까? 2. 텍스트 파일을 조작하기위한 다른 더 좋은 구성 요소가 있습니까? 3. 텍스트 파일에서 낮은 수준의 읽기를 사용해야합니까?

미리 감사드립니다.

+0

TStrings.LoadFromFile은 2 * N 메모리를 사용하며 대용량 파일에는 저급 로더를 사용해야합니다. –

답변

11

TStringList는 결코 많은 텍스트로 작업하는 최적의 방법은 아니지만 가장 간단합니다. 손에 작은 파일이 있다면 문제없이 TStringList를 사용할 수 있습니다. 대용량 파일이 아닌 대용량 파일이 있더라도 테스트 용으로 TStringList를 사용하여 간단하게 이해하기 쉬운 버전의 알고리즘을 구현할 수 있습니다.

파일이 큰 경우 "데이터베이스"라고 부르기 때문에 아마도 데이터베이스에서 필요한만큼만 읽을 수있는 대체 기술을 조사해야합니다. 메모리 매핑 된 파일

  • TFileStream을
  • :에 봐.

델파이에서 사용할 수있는 오래된 "파일"기반 API를 보지 마십시오. 평범한 것입니다.

우리가 최근 SO에 두 개의 유사한 질문을 했어 때문에 나는 그 방법을 사용하여 텍스트에 액세스하는 방법에 대한 자세한 내용에 갈 않을거야

:

How Can I Efficiently Read The FIrst Few Lines of Many Files in Delphi

Fast Search to see if a String Exists in Large Files with Delphi

1

문제가 편리하다고 생각되면 TStringList을 준수하는 것이 좋습니다. 최적화는 나중에 수행해야하는 또 다른 작업입니다.

TStringList의 경우 최적화는 TStrings.LoadFromStream 메서드를 재정의하는 하위 클래스를 선언하는 것입니다. 파일의 구조를 고려하여 최대한 빨리 만들 수 있습니다.

2

작업 할 고정 길이가 있으므로 레코드를 고려할 TWriter 및 TReader를 사용하여 TList를 기반으로 액세스 등급을 만들 수 있습니다. 당신은 TStringList의 오버 헤드를 가지지 않을 것입니다 (나쁜 것은 아니지만, 필요없는 경우 왜 필요합니까). 그러면 클래스에 레코드에 대한 자신의 액세스 권한을 만들 수 있습니다. 궁극적으로 메모리에로드 된 데이터로 수행하려는 작업에 따라 다릅니다. TStringlist는 사용하기가 쉽지만 "자신 만의 롤링"만큼 효율적이지는 않습니다.

그러나 데이터 조작의 효율성은 텍스트 파일을 사용하여 데이터베이스를 보유 할 때 그다지 문제가되지 않을 수 있습니다. 파일의 데이터를 기반으로 읽고 결정할 필요가 있다면 더 유연한 TList가 과도 할 수 있습니다.

+0

각 줄의 텍스트 길이가 고정되어 있는지 의심 스럽습니다. OP는'적어도 50 자로 150 필드를 포함하고있다 '고 말했습니다. 수정량은 필드의 수라고 생각합니다. –

1

전체 파일을 메모리에로드해야하는 이유는 무엇입니까? 그렇다면 메모리에있는 데이터 세트를 만들기 전에 어떻게해야합니까? 두 가지 문제가 얽혀 있습니까? (즉, 소스 데이터를 메모리에 완전히로드해야한다고 생각하는 메모리 내 데이터 세트를 작성해야하거나 소스 파일의 초기 사전 처리가 메모리에로드 된 전체 파일에서만 가능합니다 (이 경우는 아니지만이 경우에도 TFileStream과 같은 탐색 가능한 스트림 객체에는 필요하지 않습니다.)

하지만 내가 찾는 대답은 질문에 바로있는 것 같습니다.

이 파일을 구문 분석하고 추가 처리를 위해 추가 데이터 구조 (데이터 세트)를 채우거나 초기화하는 경우이 파일을로드하는 경우 기존의 고수준 데이터 구조를 사용하는 것은 불필요하며 잠재적으로 비용이 많이 듭니다 시간의 단계)

필요한 기능을 제공하는 가장 낮은 수준의 액세스 수단을 사용하십시오.

이 경우 TFileStream은 편의성과 사용의 편의성에서 최상의 균형을 제공 할 가능성이 높습니다.

+0

나는 from을 파일과 비교할 필요가있다. 두 개의 입력 파일, 하나는 마스터 데이터베이스, 다른 하나는 비교할 파일입니다. 비교할 파일의 특정 값과 일치하는 master 데이터베이스의 모든 필드를 나열해야합니다. – WishKnew

+0

이것은 무엇을하는지 설명하지만, 결정한 것처럼 보이는 이유를 설명하지 못합니다. 당신이 기술 한 것을하기 위해 스트림을 사용할 수 없다는 것이 여전히 나에게 명확하지 않습니다. 성능이 문제가된다면 TFileStream을 사용하여 먼저 구현할 것입니다 - 성능이 거의 즉시 TMemoryStream으로 변환 할 수있는 문제로 판명되면. 필요한 경우 * 특정 성능 문제가 실제로 발생하는 위치를 기반으로보다 정교한 구조를 볼 수 있습니다. – Deltics

관련 문제