Q&A

  • 김영대님의 홈페이지에 있는 Query한 결과를..
김영대님의 홈페이지에 있는

[소스] Query한 결과를 텍스트 파일로 저장하기(Excel 포함)를 보고 궁금한
점이 있어 질문을 드립니다.
김영대님의 소스로 텍스트로 받는건 잘 사용을 하고 있습니다.
그런데 1만건 정도의 데이타를 string으로 받으려고 합니다.
텍스트로 저장을 하지 않고 string변수로..
텍스트로 받을때 사이즈가 약 10M정도 되는데 그냥 상식으로는
string변수로 받을때는 파일로 쓰지 않기 때문에 빠를거 같았는데
실제적으로 돌려보니까 무척 느립니다..(엄청 늦네요)
TmpQryData := TmpQryData + 내용
이런식으로 하는데..
원래 느린건가요 ?

좀더 빠르게 string변수로 저장할 수 있는 방법은 없을까요 ?
3  COMMENTS
  • Profile
    한원희 2004.12.05 23:39
    안녕하세요. 한원희입니다.

    Strnig으로 문자열 연산을 하게 되면, 내부적으로 두개의 문자열이 합해질 만큼의 공간을 할당하고, 두 문자열을 복사하는 등의 메모리 재할당과 이동 연산을 수행하게 됩니다. 말씀하신것과 같이 만건을 문자열 연산으로 더한다면 그러한 동작이 만번 발생하게 되겠죠.. 엄청 느릴수 밖에 없다는... ^^;

    차라리 TMemoryStream이나, TStringStream을 사용하시는 것이 좋을것 같습니다.

    그럼 즐프~

  • Profile
    검은아이 2004.12.06 06:01
    답변 감사합니다..
    그런데 사용법을 잘 몰라서 그런데 이렇게 해 봤는데
    에러만 납니다..
    어떻게 해야 하는지 알려주시면 감사하겠습니다.

        m := TMemoryStream.Create;

        strTemp := 'AAAAA...' ; // A 100개
        j := 1;
        for i := 1 to 100000 do begin
            m.Write(strTemp[j], Length(strTemp));
            j := j + Length(strTemp);
        end;
        SetLength(Str, m.Size);
        Move(m.Memory^, Str[1], m.Size);
        
  • Profile
    한원희 2004.12.06 10:25
    안녕하세요. 한원희입니다.

    다음과 같이 하면 될것 같습니다. ^^;

      s:=TStringStream.Create(str);
      try
        strTemp := 'AAAAA...' ; // A 100개
        for i := 1 to 100000 do
          s.Write(strTemp[1], Length(strTemp));
        str:=s.DataString;
      finally
        m.Free;
      end;

    문자열을 스트림에 Write할 때, 위와 같이 strTemp[1]로 넘겨주시면 됩니다.

    그럼, 즐프~