次の例は、クライアント/サーバアーキテクチャにおいて、データの読み込みを飛躍的に高速化する方法を示しています。Regular Importメソッドでは、クライアント側でIMPORT TEXTコマンドを使用して、レコードの読み込みに要する時間を調べています:
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
INPUT FORM([Table1];"Import")
$vhStartTime:=Current time
IMPORT TEXT([Table1];Document)
$vhEndTime:=Current time
ALERT("It took "+String(0+($vhEndTime-$vhStartTime))+" seconds.")
End if
通常のデータ読み込みでは、4Dはテキストファイルを解析した後、各レコードに対して新しいレコードを作成し、読み込んだデータをフィールドに入力し、レコードをサーバマシンに送信してデータベースに追加します。そのため、大量の要求がネットワーク上でやり取りされることになります。この操作を最適化する方法の1 つとして、ストアドプロシージャを使用し、サーバマシンでローカルにこの作業を実行するやり方があります。クライアントマシンではドキュメントファイルをBLOB にロードした後、ストアドプロシージャを開始し、引数としてこのBLOB を渡します。ストアドプロシージャではこのBLOB をサーバマシンのディスク内のドキュメントファイルに保存し、このドキュメントファイルをローカルに読み込みます。ネットワーク要求がほとんどなくなるため、データ読み込みはローカルに (ローカルバージョンの4Dと比較可能な速度で) 処理されます。
次に示すのは、CLIENT IMPORTプロジェクトメソッドです。このプロジェクトメソッドはクライアントマシンで実行され、後述のSERVER IMPORTストアドプロシージャを呼び出します:
C_POINTER($1)
C_TEXT($2)
C_TIME($vhDocRef)
C_BLOB($vxData)
C_LONGINT(spErrCode)
$vhDocRef:=Open document("")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
$vhStartTime:=Current time
DOCUMENT TO BLOB(Document;$vxData)
If(OK=1)
$spProcessID:=Execute on server("SERVER IMPORT";32*1024;
"Server Import Services";Table($1);$2;$vxData)
CLEAR VARIABLE($vxData)
Repeat
DELAY PROCESS(Current process;300)
GET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
If(Undefined(spErrCode))
spErrCode:=1
End if
Until(spErrCode<=0)
spErrCode:=1
SET PROCESS VARIABLE($spProcessID;spErrCode;spErrCode)
$vhEndTime:=Current time
ALERT("It took "+String(0+($vhEndTime-$vhStartTime))+" seconds.")
Else
ALERT("There is not enough memory to load the document.")
End if
End if
以下はストアドプロシージャとして実行されるSERVER IMPORTプロジェクトメソッドです:
C_LONGINT($1)
C_TEXT($2)
C_BLOB($3)
C_LONGINT(spErrCode)
spErrCode:=1
$vpTable:=Table($1)
INPUT FORM($vpTable->;$2)
$vsDocName:="Import File "+String(1+Random)+".txt"
DELETE DOCUMENT($vsDocName)
BLOB TO DOCUMENT($vsDocName;$3)
IMPORT TEXT($vpTable->;$vsDocName)
DELETE DOCUMENT($vsDocName)
spErrCode:=0
Repeat
DELAY PROCESS(Current process;1)
Until(spErrCode>0)
Note: On Windows プロジェクトメソッドは4D Language Referenceマニュアルの_O_C_TEXTシステムドキュメントで紹介しています。
これら2 つのプロジェクトメソッドがデータベースに実装された後で、例えば次のように、“ストアドプロシージャベース”のデータ読み込みを実行できます:
CLIENT IMPORT(->[Table1];"Import")
ベンチマークテストを何度か行うと、このメソッドを使用した場合には、通常のデータ読み込みの場合と比べて最高で60倍も速くレコードを読み込めることがわかります。