質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

2506閲覧

C# MVC5 巨大なCSVのDBからの生成とダウンロード

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2018/12/14 00:58

HTTP Responseで
ContentType: octet-stream
で返してCSVダウンロードさせたい

ここでデータのサイズに比例してメモリ使用量が増加しないようにしたいです。

トラフィックが増えた-> リソースが逼迫 という考え方ならスケールアップで許容できる
誰かがでかいファイルを生成した -> リソースが逼迫 は避けたい

イメージとしては

Read ファイルをOpen 1行ずつ読み込んで yield return
Do 読み込んだ1行をごにょごにょ
Write ごにょごにょした1行を WriteLine

これを

Read 1行ずつSelect ( Cursorのイメージ )
Do 1行ずつCSV行化
Write Streaming (チャンク形式)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/12/14 01:15

どこまで自分でできるんですか? コード例を見る限り何もできないように見えますが、そうだとすると環境構築からになってしまいます。 普通にダウンロードさせるコードは書けますか?
papinianus

2018/12/14 01:32 編集

質問したいことが分からない。 [{抑制したいもの:"CSVをファイル化することで必然的に逼迫するリソースはストレージだと思いますが、本当にメモリ使用量を抑制したいのでしょうか?"},{イメージ:"ストレージを抑制したいのなら、イメージのとおりコードをかけばよいと思うのですが、何が問題なのですか?"},{メモリ:"csvファイルを1行ずつ、読む・書くを繰り返す限り、理論的には1行ずつ、セレクト・書くをするのと同じだと思います。またこのメモリ使用量はさほど抑制できないと思うので「早すぎる最適化」ではないですか?"}]
退会済みユーザー

退会済みユーザー

2018/12/14 01:34

前のスレッド https://teratail.com/questions/152549 が放置状態です。ここも同じことになるのなら、回答する気はしないです。レスを貰ったらきちんとフィードバックを返すという対応はできますか?
退会済みユーザー

退会済みユーザー

2018/12/14 07:13 編集

煽りも含めて、無視せずに回答いただきましてありがとうございます。 CSVとは書いてますがCSVファイルとは書いてません https://www.weblio.jp/content/CSV CSVはファイルではなく形式です。 CSVを保存したものがCSVファイルです。 CSVファイルを保存するにはストレージを逼迫しますし CSVファイルを一行ずつWriteLineすればいいのですが、そうではない。 CSVのダウンロード をCSVファイルをサーバーで生成してダウンロードと読み違って煽りをたくさん食らったので、わかりにくくてすみませんというのと、わかりにくいというか、CSV=ファイルという固定観念が皆さんの中にあるんだなということがわかりました。 テレビゲームを全部ファミコンと言ってしまうお年寄りにファミコンじゃないよと諭しても意味がないように、CSV=ファイルと勘違いされないようにCSV形式でメモリ上でというところまで書かないと通じないんだなと勉強になりました。
guest

回答2

0

1行づつ読み込んで、データ加工、そして1行づつファイルに追加書き込み、ということだとは思いますが、
聞きたいことはなんでしょうか

投稿2018/12/14 01:07

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/14 07:17

「CSVファイル」を作りたいのではなく サーバーでCSV形式のデータを生成してダウンロードです。 ダウンロードした結果はブラウザが勝手にファイルとして保存しますが、サーバー内の話です。
guest

0

ベストアンサー

Zuishinさん

環境構築の話なんてしてないですよ。煽りすぎです。
Content-Typeでoctet-streamを付けてバイナリのダウンロードはできますよね?

papanianusさん
必然的に逼迫するリソースはストレージ

??? DBからselectした情報はストレージが持つんですか?
selectした情報はメモリのobjectに格納されてそれをCSV形式のStringにゴニョゴニョ変換します。それはメモリないで行われますよね。
全行をListやCollectionの実態で持つと行数が増えると変換前後のデータを合わせてメモリを消費しますよね? それをyieled return形式で一行のメモリだけを消費するようにしたいんです。

SurferOnWww

放置というか求めてる回答が得られないので、、、
得られない場合、自己解決もなにもできないしベストアンサーもできないので
放置はやめてと言われても。

自己解決 チャンクダウンロードをMVCで実現

C#

1public ActionResult DownloadSample() 2 { 3 var res = System.Web.HttpContext.Current.Response; 4 var fileName = "test.csv"; 5 res.Headers.Add("Content-Type", "application/octet-stream"); 6 res.Headers.Add("content-disposition", "attachment; filename=\"" + fileName + "\""); 7 8 foreach (var b in GetContents()) 9 { 10 res.OutputStream.Write(b, 0, b.Length); 11 res.Flush(); 12 } 13 res.Close(); 14 15 // ビルド通すためのモックのようなもの。 16 return this.File(new byte[0], "application/octet-stream", "test.csv"); 17 } 18 public IEnumerable<byte[]> GetContents() 19 { 20 // 2^10 = 1KB ^20 = 1MB 21 var item = new string('a', (int)Math.Pow(2, 20)); 22 23 // 1000行 1GB 24 for (var i = 0; i < 1000; i++) 25 { 26 yield return System.Text.Encoding.UTF8.GetBytes(item + "\r\n"); 27 } 28 }

投稿2018/12/14 07:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/14 07:24

自己解決の内容の正しさではなく 感情で低評価をつける人がいるんですね。 人間だなあ
papinianus

2018/12/14 08:04 編集

誤解を生んでしまったなら記載が拙くて申し訳なかったですが、個人的にはCSVがフォーマットでそれをファイル化したものとは、区別した認識を、質問者さまと同じように持っていたつもりでおります。 > 誰かがでかいファイルを生成した -> リソースが逼迫 は避けたい という避けたい事項に対して > CSVをファイル化することで必然的に逼迫するリソースはストレージ このところで、「ファイル化することで」との前置きをしております。 もしかしたら一定の水準を満たさないものは質問への依頼や回答をするなというお立場かもしれませんが、私の依頼は煽りではなく(私はいわゆる非推奨な質問かどうかを問わず答えています)、何がやりたいかの要件を明示してほしいということでした。 あらためて説明および能力の不足についてお詫びします。
退会済みユーザー

退会済みユーザー

2018/12/14 08:32

> papinianus ご回答ありがとうございます。 papiさんは煽りではないと思います。 ただ、わかりにくい質問で申し訳なかったです。 煽りだと思ったのはその他の人たちです。 目には目をではないですが、、 わかりにくいのであればその事実だけを書いていただけると、わかるけど、環境構築から説明しないと とか、意味わからないですよね。 八つ当たり?みたいな。 他の質問について放置は、放置が良くないのはわかりましたが、書き方もあるかなあ。 答えたくなくなるなら答えなきゃいいと思うし、それをわざわざ書いて何かメリットあるのかなと。建設的じゃなくてただの憂さ晴らし、自己満足なのかなんなのか。 建設的な議論であれば、喜んで受け答えできるんですけどね。
退会済みユーザー

退会済みユーザー

2018/12/14 08:34

さらに、自己回答の中身には言及せずに、気に食わないから低評価つけていくというね。 ここって技術サイトですよね。解決策を蓄積していく場で、技術を判断しないで気に食わないから低評価をつけるってどうなんでしょうね。
Zuishin

2018/12/14 08:48

何も言わなくてもわかるだろうと思うのは普通小学校で卒業します。 低いレベルに見られたくなかったら最初からちゃんと書いてください。 ちゃんと書けないのにプライドだけ高いのは滑稽です。
退会済みユーザー

退会済みユーザー

2018/12/14 08:57

ほらまたきた。。。煽り。。。
退会済みユーザー

退会済みユーザー

2018/12/14 09:10 編集

この人絶対 禁煙エリアでタバコ吸ってる人に 正義感で注意して殴られるタイプの人だと思う。 > プライドだけ高い どの辺がそう感じたのか。これこれこういう理由でプライドが高いと判断しました。ってちゃんと書かないと。建設的なやりとりなら受け答えするけど、煽るだけっていうね。。。私から見たらあなたも滑稽ですよ。 感情屋だと言われて、言い返さないと気が済まない性格なんですね。 私も煽ってるけど(目には目をね)プライドとか小学校がどうこうとかまた非建設的なことを。 いい大人はそんな煽るようなことしないからなあ、あなたは小学生とは言わないけど子どもだよ。 プライド高いのは別に悪いことじゃないのであなたがプライドが高いことを悪く言うつもりはないですよ。
退会済みユーザー

退会済みユーザー

2018/12/14 10:44

会員制なのでもっと建設的なサイトかと思ったのですが、 評判見てみると、低俗化してるみたいですね。 むかしの掲示板で言うところの主って人たちか。 スコア稼ぎたいけど答えられないから、もっとわかるように情報かけや、ってことですかね。 ポイントが悪さしてる印象。 StackOverflow(英語版)に戻ります。 失礼しました。主たち。
Zuishin

2018/12/14 10:46

どうぞ。また追い出されても戻ってこなくて結構です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問