Q&A

  • 대용량 파일 읽기
큰 용량의 파일을 읽어서 IdHTTP로 업로드 하는데요..
업로드는 문제가 없는데
파일을 읽는데 컴퓨터가 뻗습니다.
보통 500M 정도 올리는데요...
CPU 사용이 100%이구요.. 컴이 꼼짝도..하지 않아요..
파일을 다 읽어 때 까지.. 이거..꼭 해결해야 되는데..
어떤식으로 파일을 읽어야 되는지 고수님들의 도움 꼭 부탁드립니다..

         fh := FileOpen(ListBox1.Items.Strings[I], fmOpenRead);
          if ( fh <> -1 ) Then
          Begin
              icount := FileRead(fh, buffer, sizeof(buffer));
              while icount <> 0 Do
              Begin
                  file_size := file_size + icount;
                  DataStream.WriteBuffer(buffer, icount);
                  icount := FileRead(fh, buffer, sizeof(buffer));
              End;
          End;
          FileClose(fh);
2  COMMENTS
  • Profile
    타락천사 2003.04.29 10:20
    안녕하세요. 타락임다..

    HTTP 로 대용량 파일을 주고 받으면 웹서버가 조용히 맛갑니다..

    전에 대용량 파일 처리 프로그램을 만들어 달란 제의를 받았었습니다.
    그때 얘기하며 어떻게 할께 궁리를 좀 했었죠.. (개발의뢰 금액이 너무 작어서 캔슬됬습니다.)

    그당시 제가 하려고 했던 방식은, 우선 파일을 작게 잘라서(약 1M)로 잘릅니다. 서버는 접속해 있는 사용자 들에게 차례대로 순서를 주며 조각조각 받습니다. 다 받으면 합쳐서 본래 파일을 만들어 냅니다.

    중요 요점은 한 사용자가 파일을 받는 시간이 길어지더라도 전체 사용자에게 차례대로 순서를 주는데 있습니다.

    그 외에 서버는 트래픽을 분산 시키는 기능이 있어야 할 것 입니다.

    파일을 쪼개고 합치는 API함수가 있으니, 쪼개는 것은 걱정할 일 없을겁니다.

    파일 주고 받는 것은 FTP가 좋을 겁니다.

    좀더 개선 시키면, 한 사용자가 화일 요청을 하면 접속한 사용자중 해당 파일의 조각을 가지고 있으면 바로 전송하게 하면 서버의 부하가 줄겠죠.

    정말 큰 작업 입니다. 아주 어렵고 만만하지 않은 프로그램이죠.

    즐푸하세여..

    타락천사..

  • Profile
    DirtyVictory 2003.05.01 06:19
      fh := FileOpen(ListBox1.Items.Strings[I], fmOpenRead);
      try
        if ( fh <> -1 ) Then
        Begin
          FUserCancel := false;
          icount := FileRead(fh, buffer, sizeof(buffer));
          while icount <> 0 Do
          Begin
            file_size := file_size + icount;
            DataStream.WriteBuffer(buffer, icount);
            icount := FileRead(fh, buffer, sizeof(buffer));

            Application.ProcessMessages;//취소버튼을 누를수있게 메세지처리

            //버튼을 하나 달아놓고 클릭핸들러로 FUserCancel 설정
            if FUserCancel then
            begin
              ... //작업 중지시 해야할 처리를 해줌
              break;
            end;
          End;
        End;
      finally
        FileClose(fh);
      end;

    위와 같이 하는 방법이 그나마 조금 편하게 될겁니다.

    다른 방법으로는 쓰레드에서 파일 읽기 작업을 처리하는것입니다.

    지면관계상 그건 생략 -_-;
    • 파인뷰
    • 2003.04.29 23:42
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2003.04.30 07:18
      꿈의대화님이 말씀하신대로 그와같은 작업을 합니다. 그리고 첫번째 소스를 보면 메세지큐에 쌓이기 때...
    • 꿈의대화
      2003.04.29 21:58
      .
    • 이강석
      2003.04.30 01:54
      저도 그런 문제라고 생각은 듭니다. 그런데 문제는 그 ParValue를 처리하는 부분은 제가 직접처리하는게 ...
    • 김재현
    • 2003.04.29 21:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 몽상
      2003.05.07 20:51
      SERVER NAME은 IP주소로 하는 것이 아니라.. 서비스 이름을 말하는 겁니다. 예로 : ORA817  ...
    • 쌩초보
    • 2003.04.29 20:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2003.05.01 01:35
      안녕하세요. 한원희입니다. 자식 윈도우에서 발생한 이벤트들을 부모 윈도우의 WM_COMMAND 메시지로 알...
    • 이영민
    • 2003.04.29 20:39
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2003.04.30 06:48
      님께서 제시한 내용은 아마 될꺼에요. 그러나 실제 코딩은 그와 같지 않고 다를꺼에요. 다음을 보세요....
    • 오병주
      2003.04.29 22:36
      이상하네요... 않될리가 없을테인데... 그러면 이렇게 한번 해보세요.. 소숫점 위의 값 과 소숫점 ...
    • 최광훈
    • 2003.04.29 20:34
    • 0 COMMENTS
    • /
    • 0 LIKES
    • wooki
      2003.04.29 20:42
      Anchors라는 프로퍼티가 있습니다. akRight와 akBottom을 True로 조정하고 한번 해보세요. 원하는 답이 ...
    • 오병주
      2003.04.30 01:41
      [팁] 화면을 일정한 크기대로 보여주기 (800*600) 개발한 것을 -> 1024*768 크기로 보여주기 패키지...
    • wooki
    • 2003.04.29 20:05
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 민진기
    • 2003.04.29 18:48
    • 7 COMMENTS
    • /
    • 0 LIKES
    • 이병훈
      2003.05.03 10:18
      안녕하세요. 여러 의견이 분분하시건 같아서 몇자 적습니다. ^^; 제가 보기에는 인덱스 구성이 잘못...
    • nilriri™
      2003.05.03 03:28
      Query1.SQL.Add('and to_day IS NULL'); 이부분을 쓰시기 전에.. 일괄적으로 null 값이 들어있는 컬...
    • 이추형
      2003.04.29 23:45
      다른분들이 언급한 like 문법에 대한것은 이해가 가지 않습니다. 건수가 200건 밖에 않되는데 인덱스를 타...
    • 정경철
      2003.04.29 19:44
      Query1.SQL.Add('where buseo like :A1'); 이 부분 때문에 속도가 느려진것 같습니다. 쿼리에서 Like ...
    • KDDG_ZZOM
      2003.04.29 19:18
    • 기형종
      2003.04.29 19:04
      안영하세요 작성하신 테이블에 일단 buseo가 인덱스로 설정되어야 하구요 또 like명령은 가급적 사용하지...
    • 파도랑
      2003.04.29 19:17
      like도 인덱스 사용합니다. (오라클이나 MS SQL의 경우임. 질문처럼 파라독스를 사용하면 인덱스 안쓸 수...
    • 이정한
    • 2003.04.29 11:16
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김주
    • 2003.04.29 10:28
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김주
    • 2003.04.29 10:25
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.04.29 19:59
      FillChar(Rd, SizeOf(Rd), 0); 즐프하세요...
    • 최종민
      2003.04.29 12:34
      혹시 zeromemory라는 함수를 쓰면 되지 않을까요? API인 거 같은데... 다시 초기화가 필요한가요? 그...
    • 김주
    • 2003.04.29 10:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이용훈
      2003.04.29 19:52
      찾기에서 'registry에서 시간표현 바꾸기'라는 제목을 찾으세요 김영대님이 이미 답을 해 놓으셨습니다....
    • 정민섭
    • 2003.04.29 09:05
    • 2 COMMENTS
    • /
    • 1 LIKES
    • 타락천사
      2003.04.29 10:20
      안녕하세요. 타락임다.. HTTP 로 대용량 파일을 주고 받으면 웹서버가 조용히 맛갑니다.. 전에 대용...
    • DirtyVictory
      2003.05.01 06:19
        fh := FileOpen(ListBox1.Items.Strings[I], fmOpenRead);   try   &nb...
    • 이민선
    • 2003.04.29 08:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      2003.04.29 19:03
      TZipTV라는 컴포넌트가 있습니다. www.tziptv.com 에 가보세욤 ^^; 또는 우리나라에선.. http:/...
    • 양윤정
    • 2003.04.29 07:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2003.04.29 10:24
      안녕하세요. 타락임다. 에러는 b.dcu 파일이 없다는 말입니다. 그럼 전체 검색 경로중 b.dcu 파일이 ...
    • 이상현
    • 2003.04.29 06:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2003.04.29 19:27
      엔터랑 스페이스 둘다 됩니다.
    • 초보자
    • 2003.04.29 06:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • ^ㅡ^
      2003.04.29 06:35
      답변이 될지 모르겠습니다 저두 초보라서리 일단 그룹박스에 구분을 주시고 그것을 선택한것에 대...