これまで、クエリの全体を取得してメモリに結果を格納した後、シーケンスをタイププロバイダ.CSV
に送信します。クエリの例:私はそれを理解したようクエリ結果の数は、このISN小さい場合Seq
としてクエリ自体からの出力を維持することはlazy.
になりながらNessos.Streamを使用してクエリ出力を取得して `.CSV`に出力する時間を短縮
let results =
query {
for row in db.ThisRow do
select row
}
|> Seq.toList
、Seq.toList
一部を実行するクエリを強制的に大したことじゃない。しかし、結果の数が多い場合(たとえば、1行以上の場合)、最終的にはSystem.OutOfMemoryException
となります。その結果、友人はNessos.Stream
ライブラリを使用して見てください。
私の目標は、クエリから行を引き出し、その行にいくつかの操作を行い、次にその1行を.CSV
に書き込んで、すべての行が最終的に同じ.CSV
ファイル内の各行に対して繰り返し実行することです。
だから、私は、データベースから照会きたすべての行を取得していて、これは限り動作しますが、これはまだ私はそれが何望むものをやっていないと私は」
open Nessos.Stream
type StringInt = {
String: string option
Int: int
}
type StringIntCsvType = CsvProvider<Sample = "item_number, num",
Schema = "item_number (string option), num (int)",
HasHeaders = true>
let buildRowFromObject (obj: StringInt) = StringIntCsvType.Row(obj.String,
obj.Int)
let results =
query {
for row in db.ThisRow do
select row
}
|> Stream.ofSeq
|> Stream.groupBy (fun row -> row.ITEMNUMBER)
|> Stream.map (fun (itemString, seq) -> (itemString, (seq |> Seq.length)))
|> Stream.map (fun (str, num) -> {String = Some str;
Int = num})
|> Stream.map buildRowFromObject
|> Stream.toSeq
let ThisCsv= new StringIntCsvType(results)
let ThisCsvLoc = "pathToFileLocation"
let ThisCsv.Save(ThisCsvLoc)
を試してみてくださいそれがどうなるかわからない。また、大規模なクエリの場合、私はまだSystem.OutOfMemoryException
になります。私が思うに、
は私が|> Stream.map buildRowFromObject
ラインの下
|> Stream.map (fun x -> new StringIntCsvType(x))
を挿入することができるはずだと思いますが、私はこのエラーを与えられなかった場合でもx
は
Type Constraint Mismatch. The type
CsvProvider<...>.Row
is not compatible with type
Collections.Generic.IEnumerable<CsvProvider<...>.Row>
と一緒にエラーが発生しましたさその行を追加すると、すべての行に対してという新しい.CSV
が作成されます。
私はどのようにクエリを書くことができ、それぞれの異なるクエリを操作し、クエリの各行を同じ.CSV
ファイルに書き込むことができますか?私は上記のコードで終わっていますか?
の代わりにあなたが 'グループを使用しない理由は、クライアントにby'あなたにテーブル全体をもたらします'クエリ'? 'groupBy |> map'呼び出しを削除し、クエリーを' db_howRowの行に対して '{ 'のように変更します。 groupBy row.ItemNumber into g select(g.Key、g.Count()) } – krontogiannis
確かに、私はこれを行うことができます、そして、それは質問をスピードアップしますが、それは質問の残りの部分を助けません。 – Steven
何かが行の配列を期待しているのに1行を渡しているので、エラーが発生します。それを配列またはseqでラップします。しかし、一般的には、アプローチを再考して問題を分割する必要があります。 db側の処理の中には最高のものがいくつかありますが、それがそのためのものです。それからCSVに出力するには、csvprovider、FileHelper、平易な文字列があります。これを遅延処理できるはずです。私達は関係するサイズの考えを得ることができますか?これは100GBのようなテーブルを抽出するテラバイトのデータベースのようなものでしょうか?どこでエラーが出ますか? – s952163