2012-05-04 15 views
0

私は、その場でPowerPointプレゼンテーションを作成するASP.NET Webアプリケーションを構築しています。基本は動作していますが、実際の物理ファイルはハードディスクに作成されます。これは、大規模なマルチユーザWebアプリケーションにとっては良い考えのようには思えません。アプリケーションがメモリ内にプレゼンテーションを作成し、その後それらをユーザーにストリーミングした方が良いようです。私はMemoryStreamクラスで作業する必要がありますファイルを操作する代わりに?私は、ファイルの操作とStreamsの操作の違いを理解しているとは確信していません。彼らは一種の交換可能ですか?誰でもディスク上ではなくメモリ上でファイル型操作を実行するための良いリソースを教えてもらえますか?私はこれを十分に説明してくれることを願っています。C#でメモリ内のファイルを操作する最も良い方法は何ですか?

Corey

+3

PowerPointプレゼンテーションの作成に使用しているAPIは何ですか? – user957902

+0

DocumentFormat.OpenXMLライブラリにあるクラスを使用しています。 –

答えて

0

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

は基本的には、蒸気は、単にあなたが持っていない、または、一度にメモリへのすべてのデータをロードすることができない大量のデータを扱う方法です。だから、巨大な配列や何かにデータセット全体を読み書きするのではなく、カーソルに相当するストリームを開きます。現在の位置をストリーム内の任意の場所に移動し、その位置から読み書きすることができます。

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(); 
2

あなたがに基づいて、アプリケーションのパフォーマンスに影響を考えて決断をしようとしているが、「良いように見えるしていませんアイデア "測定、これはほとんど科学的ではない。両方を実装して比較する方が良いでしょうが、どちらの実装についても懸念事項を挙げるべきです。

はここにいくつかのアイデアを開始するために、次のとおりです。

  • 一時ファイルやメモリ内のストリーム間に大きな違いは実際に存在しません。それらが十分小さい場合、両方とも物理メモリに内容を持ちますが、メモリ圧がある場合は両方ともディスクにヒットします。ファイルのクリーニングが主な関心事である場合は、ファイルに一時的なDelete on close filesを使用することを検討してください。
  • OSは、キャッシュで大容量のファイルを管理する上ですでに非常に優れた仕事をしていますが、少なくともメモリ内の純粋なソリューションがそれにマッチすることを確認する必要があります。
  • MemoryStreamは、「すべてのデータが1バイト配列です」という契約のため、適度なサイズのストリームに最適な実装ではありません(私の答えはhttps://stackoverflow.com/a/10424137/477420参照)。
  • 複数の大きなメモリ内ストリーム(複数のユーザー向け)を管理することは、x86プラットフォームにとっては楽しいですが、x64の場合はそれほど心配はありません。
  • いくつかのAPIは、単にストリームベースのクラスでの作業方法を提供し、物理的なファイルを必要としません。
関連する問題