1

その場でPowerPointプレゼンテーションを作成するASP.NETWebアプリケーションを構築しています。基本は機能していますが、ハードディスク上に実際の物理ファイルが作成されます。これは、大規模なマルチユーザーWebアプリケーションには適していません。アプリケーションがメモリ内にプレゼンテーションを作成し、それをユーザーにストリーミングして戻すとよいようです。ファイルを操作する代わりに、MemoryStreamクラスを使用する必要がありますか?ファイルでの作業とストリームでの作業の違いを正確に理解しているとは言えません。それらは一種の互換性がありますか?ディスクではなくメモリでファイルタイプの操作を行うための優れたリソースを誰かに教えてもらえますか?私はこれを十分に説明したと思います。

Corey

4

3 に答える 3

3

アプリケーションのパフォーマンスに影響を与えると思われる決定を下そうとしていますが、それは「あまり良いアイデアとは思えない」という測定結果に基づいていますが、これはほとんど科学的ではありません。両方を実装して比較する方がよいでしょうが、最初にどちらかの実装に関する懸念事項をリストする必要があります。

開始するためのいくつかのアイデアを次に示します。

  • 一時ファイルとインメモリ ストリームの間に大きな違いはありません。どちらも十分に小さい場合は物理メモリにコンテンツがあり、メモリが不足している場合は両方ともディスクにヒットします。ファイルのクリーンアップが主な関心事である場合は、ファイルを閉じるときに一時的な削除を使用することを検討してください。
  • OS は、キャッシングを使用して大きなファイルを管理するためにすでに非常に優れた仕事をしています。純粋なインメモリ ソリューションが少なくともそれと一致することを確認する必要があります。
  • MemoryStream は、「すべてのデータが 1 バイト配列にある」契約のため、合理的なサイズのストリームに最適な実装ではありません ( https://stackoverflow.com/a/10424137/477420で私の回答を参照してください)。
  • 複数の大きなインメモリ ストリーム (つまり、複数のユーザー) を管理することは、x86 プラットフォームでは楽しいものですが、x64 プラットフォームではあまり問題になりません。
  • 一部の API は、Stream ベースのクラスを操作する方法を提供せず、物理ファイルを必要とします。
于 2012-05-04T16:18:42.810 に答える
1

はい、ファイルとストリームは似ています。どちらも基本的にアレイをストリーミングしbyteます...1つはメモリから、もう1つはハードドライブから。使用しているAPIでストリームを生成できる場合は、それを簡単に実行して、Responseオブジェクトを使用してユーザーに提供できます。

次のコードは、PowerPointメモリオブジェクトを取得し(独自のAPI用に変更する必要がありますが、一般的な考え方を理解できます)、それをに保存してからMemoryStream、適切なヘッダーを設定し、ストリームを応答に書き込みます(これは次に、ユーザーがファイルをローカルコンピューターに保存できるようにします):

SaveFormat format = SaveFormat.PowerPoint2007;
Slideshow show = PowerPointWriter.Generate(report, format);
MemoryStream ms = new MemoryStream();
show.Save(ms, format);

Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-powerpoint";
Response.AddHeader("Content-Disposition", "attachment; filename=\"Slideshow.ppt\"");
Response.BinaryWrite(ms.ToArray());
Response.End();
于 2012-05-04T15:55:02.543 に答える
0

はい、MemoryStream をお勧めします。通常、ファイルにアクセスするときはいつでも、ストリームを使用してアクセスしています。多くの種類のストリーム (ネットワーク ストリーム、ファイル ストリーム、メモリ ストリームなど) があり、それらはすべて同じ基本インターフェイスを実装しています。文字列やバイト配列などではなく、ファイル ストリームで既にファイルを作成している場合は、MemoryStream に切り替えるためにコーディングをほとんど変更する必要はありません。

基本的に、Steam は大量のデータを処理する方法であり、すべてのデータを一度にメモリにロードする必要がない、またはロードできない場合があります。したがって、データのセット全体を巨大な配列などに読み書きするのではなく、カーソルに相当するストリームを開きます。現在の位置をストリーム内の任意の場所に移動し、そのポイントから読み取りまたは書き込みを行うことができます。

于 2012-05-04T15:51:58.927 に答える