자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi FireDAC. FDMEMTable의 txt 반출관련 속도개선 문의드립니다.
2018.10.16 09:52
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요.
txt반출하는 속도가 너무 안나서 조언을 듣고자 문의드립니다.
DB에 있는 고객별 로우데이타를 조회화면에서 txt로 저장하는 프로그램을 만들고 있습니다.
건수가 대략 30만건되어 FDMEMTable을 이용하여 cxGrid와 연결하여 조회는 되었는데요.
cxGrid에서 직접 txt로 반출을 하면 자료가 많다보니 에러가 발생하더군요.
그래서 FDMEMTable 데이타를 직접읽어 TXT로 반출을 했는데 대략 40분정도가 소요됩니다.
40분이나 되다보니 어쩔수 없이 사용자에게 요청올때마다 쿼리로 뽑아주고 있습니다.
txt반출속도를 빠르게 하는 방법이 있을까요?
아래는 txt로 반출하는 샘플코드입니다.
속도개선에 대한 의견이 있으시면 주저없이 댓글해주세요
감사합니다. ^^
-----------------------------------------------------------------------
if not CDS3.Active then
Exit;
try
AssignFile(TxtF, 'C:\통계조회.txt');
Rewrite(TxtF);
StrData := '가입매장브랜드'+'|'+
'가입매장코드'+'|'+
'가입매장명'+'|'+
'고객번호'+'|'+
'문자수신여부'+'|'+
'발송매장브랜드'+'|'+
'발송매장'+'|'+
'발송매장명'+'|'+
'발송유무'+'|'+
'약관동의'+'|'+
'개인정보동의'+'|'+
'마케팅동의'+'|'+
'적립포인트'+'|'+
'포인트사용유무'+'|'+
'사용포인트'+'|'+
'내용';
WriteLn(TxtF, StrData);
i := 0;
iNa := 0;
with CDS3 do
begin
CDS3.First;
while not eof do
begin
StrData := FieldByName('가입매장브랜드').AsString+'|'+
FieldByName('가입매장코드').AsString+'|'+
FieldByName('가입매장명').AsString+'|'+
FieldByName('고객번호').AsString+'|'+
FieldByName('문자수신여부').AsString+'|'+
FieldByName('발송매장브랜드').AsString+'|'+
FieldByName('발송매장').AsString+'|'+
FieldByName('발송매장명').AsString+'|'+
FieldByName('발송유무').AsString+'|'+
FieldByName('약관동의').AsString+'|'+
FieldByName('개인정보동의').AsString+'|'+
FieldByName('마케팅동의').AsString+'|'+
FieldByName('적립포인트').AsString+'|'+
FieldByName('포인트사용유무').AsString+'|'+
FieldByName('사용포인트').AsString+'|'+
FieldByName('내용').AsString;
WriteLn(TxtF, StrData);
next;
end;
end;
CloseFile(TxtF);
ShowMessage(pChar('C:통계조회.txt 로 저장되었습니다.'));
except on E: Exception do
begin
ShowMessage('TXT파일이 저장되지 않았습니다.');
end;
end;
댓글 4
-
지병철
2018.10.16 11:30
-
험프리
2018.10.17 10:28
두가지 방법을 제안 드립니다.
1, FireDAC ETL 기능을 검토해보시기 바랍니다.
http://tech.devgear.co.kr/delphi_news/410458
2, 파일 I/O 작업이 오래 걸릴 수 있을 수 있습니다.
메모리 매핑된 파일로 작업하면 I/O 부분 속도를 개선할 수 있을 것 같습니다.
http://landman-code.blogspot.com/2006/04/it-has-been-six-months-since-i-last.html
https://code.i-harness.com/ko-kr/q/6f46e
위의 지병철님 댓글도 참고하시기 바랍니다.
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-
동그랑땡88
2018.10.22 14:21
- DataSource 를 사용해서 DB Control 들에 연결했으면 위 댓글처럼 DisableControls, EnableControls 는 필수구요...
- 추가로 건수가 많으면 FieldByName 대신에 Fields[0].asString 처럼 Index 번호로 사용하시면 속도 개선에 도움이 됩니다.
-
오바라미
2018.10.22 16:18
답변 감사드립니다.
DisableControls;
EnableControls;
이 명령어는 필수군요.. 이제야 알았습니다. 공부좀 해야겠네요.. ^^;;
txt로 변환하는데 5초 걸립니다.
정말 감사드립니다.
아래는 변환되는 샘플코드입니다.
----------------------------------------------------------------------------
procedure Form.Btn1Click(Sender: TObject);
var TxtF: TextFile;
FileStream: TFileStream;
StrData: string;
StrListHead : TStringList;
StrListData : TStringList;
i : integer;
begin
if not CDS1.Active then
Exit;
StrListHead := TStringList.Create;
StrListData := TStringList.Create;
StrListHead.Clear;
StrListData.Clear;
ExtractStrings([#44], [], PChar(Common.GetVisibleGridViewColumn(DBGridView1)), StrListHead); // , 로 분리
ExtractStrings([#44], [], PChar(Common.GetVisibleGridViewColumn(DBGridView1)), StrListData); // , 로 분리
try
AssignFile(TxtF, 'C:\aa.txt');
Rewrite(TxtF);
StrData := '';
for i := 0 to StrListHead.Count-1 do
begin
StrData := StrData + '|' + DBGridView1.GetColumnByFieldName(PChar(StrListHead[i])).Caption;
end;
WriteLn(TxtF, StrData);
CDS1.DisableControls;
with CDS1 do
begin
CDS1.First;
while not eof do
begin
StrData := '';
for i := 0 to StrListData.Count-1 do
begin
StrData := StrData + '|' + FieldByName(PChar(StrListData[i])).AsString;
end;
WriteLn(TxtF, StrData);
next;
end;
end;
CloseFile(TxtF);
CDS1.EnableControls;
ShowMessage(pChar('C:aa.txt 로 저장되었습니다.' ));
StrListHead.Free;
StrListData.Free;
except on E: Exception do
begin
ShowMessage(pChar('TXT파일이 저장되지 않았습니다.'));
CDS1.EnableControls;
StrListHead.Free;
StrListData.Free;
end;
end;
end;
Delphi FireDAC. FDMEMTable의 txt 반출관련 속도개선 문의드립니다.
2018.10.16 09:52
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요.
txt반출하는 속도가 너무 안나서 조언을 듣고자 문의드립니다.
DB에 있는 고객별 로우데이타를 조회화면에서 txt로 저장하는 프로그램을 만들고 있습니다.
건수가 대략 30만건되어 FDMEMTable을 이용하여 cxGrid와 연결하여 조회는 되었는데요.
cxGrid에서 직접 txt로 반출을 하면 자료가 많다보니 에러가 발생하더군요.
그래서 FDMEMTable 데이타를 직접읽어 TXT로 반출을 했는데 대략 40분정도가 소요됩니다.
40분이나 되다보니 어쩔수 없이 사용자에게 요청올때마다 쿼리로 뽑아주고 있습니다.
txt반출속도를 빠르게 하는 방법이 있을까요?
아래는 txt로 반출하는 샘플코드입니다.
속도개선에 대한 의견이 있으시면 주저없이 댓글해주세요
감사합니다. ^^
-----------------------------------------------------------------------
if not CDS3.Active then
Exit;
try
AssignFile(TxtF, 'C:\통계조회.txt');
Rewrite(TxtF);
StrData := '가입매장브랜드'+'|'+
'가입매장코드'+'|'+
'가입매장명'+'|'+
'고객번호'+'|'+
'문자수신여부'+'|'+
'발송매장브랜드'+'|'+
'발송매장'+'|'+
'발송매장명'+'|'+
'발송유무'+'|'+
'약관동의'+'|'+
'개인정보동의'+'|'+
'마케팅동의'+'|'+
'적립포인트'+'|'+
'포인트사용유무'+'|'+
'사용포인트'+'|'+
'내용';
WriteLn(TxtF, StrData);
i := 0;
iNa := 0;
with CDS3 do
begin
CDS3.First;
while not eof do
begin
StrData := FieldByName('가입매장브랜드').AsString+'|'+
FieldByName('가입매장코드').AsString+'|'+
FieldByName('가입매장명').AsString+'|'+
FieldByName('고객번호').AsString+'|'+
FieldByName('문자수신여부').AsString+'|'+
FieldByName('발송매장브랜드').AsString+'|'+
FieldByName('발송매장').AsString+'|'+
FieldByName('발송매장명').AsString+'|'+
FieldByName('발송유무').AsString+'|'+
FieldByName('약관동의').AsString+'|'+
FieldByName('개인정보동의').AsString+'|'+
FieldByName('마케팅동의').AsString+'|'+
FieldByName('적립포인트').AsString+'|'+
FieldByName('포인트사용유무').AsString+'|'+
FieldByName('사용포인트').AsString+'|'+
FieldByName('내용').AsString;
WriteLn(TxtF, StrData);
next;
end;
end;
CloseFile(TxtF);
ShowMessage(pChar('C:통계조회.txt 로 저장되었습니다.'));
except on E: Exception do
begin
ShowMessage('TXT파일이 저장되지 않았습니다.');
end;
end;
댓글 4
-
지병철
2018.10.16 11:30
-
험프리
2018.10.17 10:28
두가지 방법을 제안 드립니다.
1, FireDAC ETL 기능을 검토해보시기 바랍니다.
http://tech.devgear.co.kr/delphi_news/410458
2, 파일 I/O 작업이 오래 걸릴 수 있을 수 있습니다.
메모리 매핑된 파일로 작업하면 I/O 부분 속도를 개선할 수 있을 것 같습니다.
http://landman-code.blogspot.com/2006/04/it-has-been-six-months-since-i-last.html
https://code.i-harness.com/ko-kr/q/6f46e
위의 지병철님 댓글도 참고하시기 바랍니다.
——————
답글이 도움이 되셨는지 다른 분들도 참고할 수 있도록 결과 댓글 부탁드립니다.
(결과 댓글이 없는 경우 다른 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-
동그랑땡88
2018.10.22 14:21
- DataSource 를 사용해서 DB Control 들에 연결했으면 위 댓글처럼 DisableControls, EnableControls 는 필수구요...
- 추가로 건수가 많으면 FieldByName 대신에 Fields[0].asString 처럼 Index 번호로 사용하시면 속도 개선에 도움이 됩니다.
-
오바라미
2018.10.22 16:18
답변 감사드립니다.
DisableControls;
EnableControls;
이 명령어는 필수군요.. 이제야 알았습니다. 공부좀 해야겠네요.. ^^;;
txt로 변환하는데 5초 걸립니다.
정말 감사드립니다.
아래는 변환되는 샘플코드입니다.
----------------------------------------------------------------------------
procedure Form.Btn1Click(Sender: TObject);
var TxtF: TextFile;
FileStream: TFileStream;
StrData: string;
StrListHead : TStringList;
StrListData : TStringList;
i : integer;
beginif not CDS1.Active then
Exit;StrListHead := TStringList.Create;
StrListData := TStringList.Create;
StrListHead.Clear;
StrListData.Clear;ExtractStrings([#44], [], PChar(Common.GetVisibleGridViewColumn(DBGridView1)), StrListHead); // , 로 분리
ExtractStrings([#44], [], PChar(Common.GetVisibleGridViewColumn(DBGridView1)), StrListData); // , 로 분리try
AssignFile(TxtF, 'C:\aa.txt');
Rewrite(TxtF);StrData := '';
for i := 0 to StrListHead.Count-1 do
begin
StrData := StrData + '|' + DBGridView1.GetColumnByFieldName(PChar(StrListHead[i])).Caption;
end;WriteLn(TxtF, StrData);
CDS1.DisableControls;
with CDS1 do
begin
CDS1.First;
while not eof do
begin
StrData := '';
for i := 0 to StrListData.Count-1 do
begin
StrData := StrData + '|' + FieldByName(PChar(StrListData[i])).AsString;
end;WriteLn(TxtF, StrData);
next;
end;
end;CloseFile(TxtF);
CDS1.EnableControls;ShowMessage(pChar('C:aa.txt 로 저장되었습니다.' ));
StrListHead.Free;
StrListData.Free;except on E: Exception do
begin
ShowMessage(pChar('TXT파일이 저장되지 않았습니다.'));
CDS1.EnableControls;
StrListHead.Free;
StrListData.Free;
end;
end;end;
혹, CDS3 와 cxGrid 를 연결하려고, Datasource 를 이용해서 그럴 수 도 있을 것 같습니다.
코드맨위와 아래에 다음과 같이 입력하고 실행해 보세요.
CDS3.DisableControls;
...
...
CDS3.EnableControls;
- 수고요 -