リモートdBに接続して複数のクエリを実行するコンソールアプリケーションがあります。メモリ使用量を向上させるためのストリームラインクエリ:OutOfMemory例外
私は64ビットのF#を使ってアプリケーションを構築しています。私はこのパスとしてこれを確信しています。
C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\fsc.exe
は、ビルドプロセス中にF#フレームワークパスとして使用されます。また、上記のファイル・パスは、私のPATH環境変数
である各クエリは、これらのクエリ結果をアプリに下流で使用されているよう
query{expression}
|> Seq.toArray
|> Array.map (fun q -> {a = q.a;
b = q.b;
etc...}
|> writeToJson ("filePath")
として、私はJSON
ファイルに書き込む構成されています。
App.config
ファイルに
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
が含まれているように私は、クエリでArray
Sを使用
。 This pageこの
を含むことを示唆している...合計サイズが2ギガバイト(GB)よりも大きいアレイが可能となります。
残念ながら、いくつかの2番目のクエリでは、OutOfMemory
の例外が発生します。
クエリ
query {
for header in db.CustomerDetails do
leftOuterJoin row in db.MDR_0916
on (header.PID = row.PID) into result
for row in result do
select ([row.APSci;
row.Charter;
row.VirtualSchool;
row.AffIndicator], header)
}
|> Seq.toArray
|> Array.map (fun (row, header) -> {CustId = Option.ofNullable header.CBSCUSTOMERID;
IDType = Option.ofObj header.IDTYPE;
Name = Option.ofObj header.CUSTOMERNAME;
State = Option.ofObj header.STATE;
AcctStatus = Option.ofObj header.ACCOUNTSTATUS;
Contract = Option.ofObj header.CONTRACT;
ContractDesc = Option.ofObj header.CONTRACTDESCRIPTION;
AcctMgr = Option.ofObj header.ACCOUNTMANAGER;
InstType = Option.ofObj header.CUSTOMERNAME;
InstDesc = Option.ofObj header.INSTITUTIONTYPEDECRIPTION;
MDR = Some {HasApSci = (row |> List.item 0);
IsCharter = (row |> List.item 1);
IsVirtualSchool = (row |> List.item 2);
AffRating = (row |> List.item 3)}})
|> writeToJson (Path.Combine(recEngTresorFolder, "rawCustomers.json"))
戻っ〜250万件の結果。クエリの結果をパイプしているsizeof<RawCustomer>
は8
です。
どのようにOOM例外が発生するのを防ぐことができるか知っていますか? gcAllowVeryLargeObjects
の間にF#64ビットを使用すると、それが処理されると思いました。
私はアレイの使用を避けることを試みます。セティは怠惰です。 –
'Seq'としてすべてを保持しても、クエリやOOM例外の動作は変わりません。 – Steven
btw、私は64ビットがどれくらいのスペースに対処できるのか正確にはわかりませんが、TBの領域です。プロセスが32ビットの場合は、3GB程度の問題が発生する可能性があります。多分あなたは記憶を漏らしていますか? – s952163