통합검색
· 마을서비스란?  · 포럼마을  · 일반마을  · 테마마을  · 마을랭킹  · 활동왕
· 덱스퍼트란?  · TECBOX   · PRSBOX   · 이용안내  
· DEXT제품군  · 솔루션베이  · S/W & ESD 컴포넌트
· 프로그램베이
· LiveSeminar  · LiveConference
데브피아 C# 포럼 마을에 오신 것을 환영합니다.
  마을등급 C#   이 마을은 포럼마을 입니다이 마을은 자유가입제 마을 입니다 마을소개 페이지로 이동 전입신청
마을촌장촌장 비사모 주민 12902 since 2006-12-28
우리마을 공지사항
질문&답변
강좌&팁
자유게시판
자료실
앨범
개인게시판
[마을 게시판]
구인/구직 게시판
건의 / 운영 제안
랑데브 게시판
칼럼 게시판
개발자 고충상담
Dev Talk
자유토론방
벼룩시장
재나미 우스개
구인/프로젝트 정보
사람인 채용 게시판
  고객지원 게시판
마이 데브피아
 나의 e-Money 내역
 활동왕 My Page
 스크랩한 게시글보기
 쪽지관리
 주소록관리

 질문&답변 ※ 꼭 답변채택을 해주시어 성의껏 답변해주신 회원님께 감사의 마음을 전하시길 바랍니다.
 Datatable내 수정이 많을때 적합한 방법 문의  | WinForm Program 2020-03-26 오후 10:10:14
아스파넬 번호: 180029 추천:0  / 읽음:61

현재 키움API로 주식자동매매 프로그램을 개발하고 있습니다. 종목의 시세를 표현하려고 DevExpress의 Gridview를 사용하고 있고요. 얘의 DataSource로 DataTable을 사용하고 있습니다.

 

Row수(종목수)가 적게는 50개, 많을때는 100개 되는 상태고 1초에 20번 내외로 Data수정이 있습니다.

 

기능은 정상적으로 작동하긴한데, 시간이 지나면 지날수록 프로그램이 조금씩 느려진다는 느낌이 들더라구요. 

 

혹시 제가 사용하는 방법에 문제가 있는지 문의드립니다.

 

 

<< Data 수정시 >>

 

dt매수가 Gridview의 DataSource인 DataTable입니다.

col이라고 붙은건 다 Column이고요. 종목코드를 key값으로 해놔서 table에 종목이 하나씩만 들어가게 해놨습니다.

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

string qry = string.Format("col종목코드='{0}'", 종목코드);  

 

DataRow[] qryRows매수 = dt매수.Select(qry);  

DataRow newRow매수;

 

if (qryRows매수.Length == 0) //종목코드가 없을경우 새로 Row생성

{

   newRow매수 = dt매수.NewRow();

   newRow매수["col종목코드"] = 종목코드;

   newRow매수["col종목명"] = 종목명;

}

else  // 있다면 첫번째 row갖고옴(어차피 한개뿐일테니)

{

   newRow매수 = qryRows매수[0]; 

}

 

newRow매수["col보유수량"] = 보유수량;

newRow매수["col매입가"] = 체결가격;

newRow매수["col총매입수량"] = 체결수량;

newRow매수["col매도가능수량"] = 보유수량 - 매도주문수량;

newRow매수["col현재가"] = 현재가;

 

if (qryRows매수.Length == 0)

{

   dt매수.Rows.Add(newRow매수);

}

-------------------------------------------------------------------------끝.

 

 

질문1. 위 처럼 Select로 하는게 좀 느린거 같다는 생각이 드는데 혹시 이것 때문일까요? Row가 적으면 별차이 없다고 하는데 for문으로 돌려서 Row를 찾는게 나을까요? 

DataRow[] qryRows매수 <- 얘를 종목갱신시마다 만들텐데 가비지가 어마어마할거 같은생각도 들고요. 해당 Row를 찾는 좀더 좋은 방법이 있을까요? 

 

질문2.  BeginLoadData(), EndLoadData()를 안해도 수정이 되던데, 혹시 이걸 꼭 해야하는건가요? 마찬가지로 수정후 AcceptChanges()도 꼭 필요한지 궁금합니다.

아니면 Data수정시마다 해줘야하는 또 다른게 있는지요?

 

질문3. 혹시 어느 컴포넌트나, 객체 또는 변수가 얼마의 메모리를 차지하고 있는지 분석할수 있는 방법이 있을까요? 아니면 기타 메모리 누수를 진단할수 있는 방법이 있는지 궁금합니다.

 

기타 수정이 필요한 부분이 있거나 혹시 좀더 좋은 방법이 있다면 알려주시면 너무 감사하겠습니다.

이 글에 답변 등록하기
[채택답변] 제목입니다.
1
2020-03-28 오후 8:01:02
질문자 인사 : 친절한 답변 감사드려요~^^
  밍키 번호: 180030  

DataTable은 현재(최종본), 최초 원본 그리고 추가, 수정, 삭제 내역을 보관 합니다.

그래야 Database에 쿼리로 전달할수가 있는거죠

삭제된 목록이 있어야 delete 쿼리를 만들수 있고 수정된 필드 내역이 있어야 update 쿼리를 만들수 있는것 처럼 말이죠.

모든 내역을 지우고 현재(최종본) 상태를 유지하는게 AcceptChange 메서드 입니다.

왜 느려지는지, 저 메서드는 왜 호출해야되는지 촉이 오셨으리라 생각합니다.

 

메모리 누수 확인은 프로파일러 라는게 있고, VS2017 부터는 기본적으로 같이 실행이 됩니다.

(디버깅 할때 오른쪽에 뜨는 메모리 그래프)

https://docs.microsoft.com/en-us/visualstudio/profiling/memory-usage?view=vs-2019

객체 별로 확인이 됩니다.

이전에는 외부 툴 형태로 별도 실행해서 분석해야 했어요

서드파티 프로그램도 있습니다.

https://memprofiler.com/

 

 [답변]제목입니다. 2020-03-27 오전 12:56:32
밍키 번호: 180030 추천:1  

DataTable은 현재(최종본), 최초 원본 그리고 추가, 수정, 삭제 내역을 보관 합니다.

그래야 Database에 쿼리로 전달할수가 있는거죠

삭제된 목록이 있어야 delete 쿼리를 만들수 있고 수정된 필드 내역이 있어야 update 쿼리를 만들수 있는것 처럼 말이죠.

모든 내역을 지우고 현재(최종본) 상태를 유지하는게 AcceptChange 메서드 입니다.

왜 느려지는지, 저 메서드는 왜 호출해야되는지 촉이 오셨으리라 생각합니다.

 

메모리 누수 확인은 프로파일러 라는게 있고, VS2017 부터는 기본적으로 같이 실행이 됩니다.

(디버깅 할때 오른쪽에 뜨는 메모리 그래프)

https://docs.microsoft.com/en-us/visualstudio/profiling/memory-usage?view=vs-2019

객체 별로 확인이 됩니다.

이전에는 외부 툴 형태로 별도 실행해서 분석해야 했어요

서드파티 프로그램도 있습니다.

https://memprofiler.com/

 

이 글에 답변 등록하기
 [답변]ㅜㅜㅜㅜㅜ 2020-03-27 오전 9:03:08
 pearly  pearly님께 메시지 보내기pearly님을 내 주소록에 추가합니다.pearly님의 개인게시판 가기 번호: 180033 추천:1  

질문1.

select도 느리진 않습니다. 하지만 신경이 쓰이실테니..

저의 경우는 Hashtable이나. 아님 Dictionarly에 넣어서 사용합니다. 이같은 경우는 Dic이 더 좋아 보이네요.

 

질문2.

LoadData? 를 왜 하시는지는 모르겠지만. 안하셔도 됩니다. 

AcceptChange도 당근 안하셔도 됩니다.

 

질문3

패스~

 

 

이 글에 답변 등록하기
         [답변]답변감사합니다. 2020-03-28 오후 8:09:14
아스파넬 번호: 180044 추천:0  

친절한 답변 감사합니다. 알려주신대로 적용해보았는데 원격으로 봐서 체감이 많이 되진 않았지만 조금 빠른것도 같으네요. 

메모리 프로그램도 한번 살펴보겠습니다. 감사합니다.

이 글에 답변 등록하기
         [답변]dictionary를 어떻게 binding해야할지요? 2020-03-28 오후 8:26:20
아스파넬 번호: 180045 추천:0  

안그래도 Dictionary를 <종목코드(string), 매수종목(class)>로 사용하고 있습니다. 매수종목 class는 테이블 컬럼에 맞게 값들 그대로 필드를 만들어서 클래스를 하나 만들었구요. 


체결정보나 중복주문방지등 관리를 위해 dictionary를 주로 사용하고 사실 gridview는 dictionary의 변수값들을 토대로 화면에만 뿌려주는 용도입니다.

 

안그래도 dictionary로 gridview에 연결하고 싶었는데 제가 검색을 못했는지 별도 클래스를 value로 쓰는 dictionary는 잘 안보이더라구요.

 

public class 매수종목

{

     //key = 종목코드, val[0] = int 매입가, val[1] 매입수량, val[2] 매입시간

     private string s종목코드;

     private string s종목명;

     private int i매입가 = 0;

     private int i총매수주문수량 = 0;

     private int i매수주문수량 = 0;

     private int i총매입수량 = 0;

     private int i보유수량 = 0;        

     private DateTime d매도시간;


    //리펙터링 생략..

}

 

대충 이렇게 구성했다고 했을때, Gridview에 각 항목을 어떻게 연결을 해야될까요? 

gridview의 column은 매수종목 class의 필드에 해당하는 값들로 모두 생성해논 상태입니다. (col매입가, col총매수주문수량 등등..)

 

혹시 참고할만한 간단한 예제나 링크가 있다면 알려주시면 감사하겠습니다.

이 글에 답변 등록하기
목록 보기   지금 보고 계시는 글을 회원님의 my Mblog >> 스크랩에 넣어두고 다음에 바로 보실 수 있습니다.  
회사소개  |   개인정보취급방침  |  제휴문의  |   광고문의  |   E-Mail 무단수집거부  |   고객지원  |   이용안내  |   세금계산서
사업자등록번호 안내: 220-81-90008 / 통신판매업신고번호 제 2017-서울구로-0055호 / 대표: 홍영준, 서민호
08390, 서울시 구로구 디지털로32길 30, 1211호 / TEL. 02_6719_6200 / FAX. 02-6499-1910
Copyright ⓒ (주) 데브피아. All rights reserved.