Q&A

  • 대용량 자료를 Query하는데 문제가...
좀 무식한 방법이지만...



대용량의 자료를 Oracle에서 Select해옵니다. 약 20만건...



이렇게 했을때 Query는 되는데 이 Query결과를 차례로 Next명령으로



순차적으로 읽어오면 어느정도 지난 후 메모리가 부족하다고 에러가 발생합니다.



NT Server에서 실행하는데 프로세스를 보면 Next명령때 메모리가 계속 증가하는데



그것 때문인것같습니다.







select * from tablename 쿼리...한후



...



first;

while not eof do

begin

일반적인 처리루틴...

next;

end;



루프 도중에 위와 같은 Error가...





이런 경우 어떻게 처리해야 해결할 수 있을지...



Next로 지나온 Record자료를 메모리에서 해제할 수 있으면 좋은데...



고수님의 좋은 해결책을 기다리겠습니다.



2  COMMENTS
  • Profile
    김하늘 2000.11.04 01:19
    일반적인 루틴부분이 궁금하네여



    20만건의 레코드를 쿼리하고 next한다고 메모리가 증가되는 건 아닌것 같은디여...

    설사 그렇더라도 시스템이 죽는 현상까지는 발생하지 않을 것 같은데여

    아마도 일반적인 루틴부분에 메모리를 올리는 제대로 해제하지 않는 코딩이

    있을듯 하네여



    글구 왜 풀로 왜 읽어야 하는 걸까요 자료를 텍스트파일이나 백업용으로

    뭔작업을 하시려나여....





    윤 wrote:

    > 좀 무식한 방법이지만...

    >

    > 대용량의 자료를 Oracle에서 Select해옵니다. 약 20만건...

    >

    > 이렇게 했을때 Query는 되는데 이 Query결과를 차례로 Next명령으로

    >

    > 순차적으로 읽어오면 어느정도 지난 후 메모리가 부족하다고 에러가 발생합니다.

    >

    > NT Server에서 실행하는데 프로세스를 보면 Next명령때 메모리가 계속 증가하는데

    >

    > 그것 때문인것같습니다.

    >

    >

    >

    > select * from tablename 쿼리...한후

    >

    > ...

    >

    > first;

    > while not eof do

    > begin

    > 일반적인 처리루틴...

    > next;

    > end;

    >

    > 루프 도중에 위와 같은 Error가...

    >

    >

    > 이런 경우 어떻게 처리해야 해결할 수 있을지...

    >

    > Next로 지나온 Record자료를 메모리에서 해제할 수 있으면 좋은데...

    >

    > 고수님의 좋은 해결책을 기다리겠습니다.

    >

  • Profile
    2000.11.04 01:32
    이정도 소스면 매우 간단한 것이니 직접 NT에서 테스트 해보세요



    TQuery의 SQL에 적당히 SELECT문은 넣어시구...

    SELECT * FROM TABLENAME...



    그리고 프로세스관리자로 확인하면 메모리가 늘어나요...

    ---------------------------------------------------------------

    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    StdCtrls, Grids, DBGrids, Db, DBTables;



    type

    TForm1 = class(TForm)

    Q: TQuery;

    DataSource1: TDataSource;

    DBGrid1: TDBGrid;

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    procedure TForm1.Button1Click(Sender: TObject);

    begin

    Q.Open;

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    begin

    Q.Last;

    end;



    procedure TForm1.Button3Click(Sender: TObject);

    begin

    With Q do

    begin

    First;

    While not EOF do

    begin

    Next;

    end;

    end;

    end;



    end.







    ------------------------------------------------------------------







    object Form1: TForm1

    Left = 198

    Top = 107

    Width = 696

    Height = 480

    Caption = 'Form1'

    Color = clBtnFace

    Font.Charset = DEFAULT_CHARSET

    Font.Color = clWindowText

    Font.Height = -11

    Font.Name = 'MS Sans Serif'

    Font.Style = []

    OldCreateOrder = False

    PixelsPerInch = 96

    TextHeight = 13

    object DBGrid1: TDBGrid

    Left = 136

    Top = 12

    Width = 405

    Height = 249

    DataSource = DataSource1

    ImeName = '한국어(한글)'

    Options = [dgEditing, dgAlwaysShowEditor, dgTitles, dgIndicator, dgColumnResize, dgColLines, dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit]

    TabOrder = 0

    TitleFont.Charset = DEFAULT_CHARSET

    TitleFont.Color = clWindowText

    TitleFont.Height = -11

    TitleFont.Name = 'MS Sans Serif'

    TitleFont.Style = []

    end

    object Button1: TButton

    Left = 60

    Top = 292

    Width = 75

    Height = 25

    Caption = 'Button1'

    TabOrder = 1

    OnClick = Button1Click

    end

    object Button2: TButton

    Left = 152

    Top = 292

    Width = 75

    Height = 25

    Caption = 'Button2'

    TabOrder = 2

    OnClick = Button2Click

    end

    object Button3: TButton

    Left = 240

    Top = 292

    Width = 75

    Height = 25

    Caption = 'Button3'

    TabOrder = 3

    OnClick = Button3Click

    end

    object Q: TQuery

    Active = True

    DatabaseName = 'bang'

    SQL.Strings = (

    'SELECT * FROM AUXMST')

    Left = 28

    Top = 16

    end

    object DataSource1: TDataSource

    DataSet = Q

    Left = 72

    Top = 16

    end

    end