Batch 모드로 데이터베이스에 데이터를 로딩하는 데 가장 빠른 방법은 없나요?
라고 질문한다면 그 답은 바로 Cache DB에 있다고 알려주고 싶다.
이때 사용되는 Cache ObjectScript 함수는 바로 $LISTFROMSTRING() 이다.
COS에서 디스크에 있는 테이블의 데이터 구조를 알면 값을 직접 변경할 수 있다는 것은 파워풀한 COS를 사용해 본 사용자라면 다들 알고 있을 것이다. 가령, MyData 라는 클래스(테이블)가 있고, 해당하는 필드가 A1,A2,A3,A4,CX,CY로 여섯 개가 있다고 가정하면,
Class User.MyData Extends (%Persistent, %Populate)
{
Property A1 As %String;
Property A2 As %String;
Property A3 As %String;
Property A4 As %String;
Property CX As %Integer;
Property CY As %Integer;
}
이 테이블은 아래와 같은 글로벌(데이터) 구조에 따라 저장되게 된다:
1: |
^User.MyDataD |
= |
1 |
2: |
^User.MyDataD(1) |
= |
$lb("","A1값","A2값","A3값","A4값","CX값","CY값") |
이때, 맨 앞에 한 칸은 ""로 두어야 한다는 것을 유의하기 바란다.
테이블의 데이터가 매번 외부 파일에서 다시 로딩되어야 하는 경우라면, 아래와 같은 Method를 만들어서 바로 로딩이 가능하다.
ClassMethod LoadFile(filename As %String) As %Status
{
set file=##class(%FileCharacterStream).%New()
set sc=file.LinkToFile(filename)
if 'sc {w !,"File Open error!",! q}
set i=1
do {
set token=file.ReadLine()
// Trim
set token=","_$e(token,1,$L(token)-1)
// Insert
set ^User.MyDataD(i)=$LISTFROMSTRING(token)
set i=i+1
}while 'file.AtEnd
set ^SPECTRADB.MyDataD=i-1
quit $$$OK
}
Test.txt 파일을 아래와 같이 만들어서 C:\temp 디렉터리에 넣어 두고 수행해 보자.
샘플 Test.txt 파일 내용:
123123123,12312312,112,122,12312312312,1223123123,
321123123,12312312,112,122,12312312311,1223123124,
위 파일은 마지막에 한줄이 더 들어가지 않도록 주의하여야 한다.
이제 Cache 터미널에서 아래와 같은 명령으로 수행해 보자.
> write ##class(User.MyData).LoadFile("c:\temp\Test.txt")
시스템관리포탈 홈-글로벌-네임스페이스-해당 글로벌 보기에서 아래와 같은 결과가 나왔으면 성공:
1: |
^User.MyDataD |
= |
2 |
2: |
^User.MyDataD(1) |
= |
$lb("","123123123","12312312","112","122","12312312312","1223123123") |
3: |
^User.MyDataD(2) |
= |
$lb("","321123123","12312312","112","122","12312312311","1223123124") |
시간이 허락한다면, Load File 앞 뒤에 Timestamp를 찍어서 소요된 시간을 표시해 보면 더 보람이 있을 것이다.
위와 같은 방법으로, Cache에서 일괄 처리에 최적화된 데이터 로딩을 수행할 수 있다. 궁금한 점은 이메일로 문의하세요.
|