1

データベースから特定のレコードをテキスト ファイルとしてダウンロードするアクションを作成する必要があります。以下のコードは、おもちゃの例 (少数のレコード) では問題なく動作します。このコードが本番環境にプッシュされると、メモリが不足していることが判明しました。私が扱うデータ量はGbsのオーダーです

 public FileResult Streammer()
    {
        MemoryStream file = new MemoryStream();

        using (var db = new DbMapper())
        {
            while (true)
            {
                List<Record> records = db.GetNext(10000);

                if (records == null)
                    break;

                foreach (Record r in records)
                {
                    byte[] data = r.GetBytes();
                    file.Write(data, 0, data.Length);
                }
            }
        }

        file.Position = 0;

        return new FileStreamResult(file, "text") { FileDownloadName = "junk.txt" };
    }

理想的には、サーバー上の DB からレコードのチャンクを読み取りたいと考えています。単一のチャンクが読み取られると、すぐに変換されてクライアントにストリーミングされます。クライアントは、残りの時間/サイズを実際に示すことなく、標準のダウンロード インジケーターを表示します。

任意の推奨事項をいただければ幸いです。

4

1 に答える 1

0

これに対する最善の策は、ストリームから継承し、Read メソッドをオーバーライドするデータベース用のラッパーを作成することです。次に、代わりに FileStream オブジェクトがコードからデータを取得します。データベースからデータを一度にロードしないように、ある種のページング ロジックを実装できます。

于 2013-09-17T21:38:39.267 に答える