1

我正在构建一个动态创建 PowerPoint 演示文稿的 ASP.NET Web 应用程序。我有基本的工作,但它会在硬盘上创建实际的物理文件。对于大型多用户 Web 应用程序来说,这似乎不是一个好主意。如果应用程序在内存中创建演示文稿,然后将它们流式传输回用户,似乎会更好。我应该使用 MemoryStream 类而不是操作文件吗?我不确定我是否理解使用文件和使用流之间的区别。它们可以互换吗?谁能指出我在内存而不是磁盘上进行文件类型操作的好资源?我希望我已经很好地描述了这一点。

科里

4

3 回答 3

3

您正在尝试根据“似乎不是一个好主意”的测量来做出您认为会影响应用程序性能的决定,这几乎不科学。最好同时实现两者并进行比较,但首先您应该列出您对任一实现的担忧。

以下是一些开始的想法:

  • 临时文件和内存流之间确实没有太大区别。如果它们足够小,它们都会在物理内存中包含内容,如果存在内存压力,它们都会撞击磁盘。如果清理文件是主要问题,请考虑在关闭文件时使用临时删除。
  • 操作系统已经在使用缓存管理大文件方面做得很好,需要确保纯内存解决方案至少与之匹配。
  • MemoryStream 不是合理大小的流的最佳实现,因为它的“所有数据都在单字节数组中”合同(请参阅我在https://stackoverflow.com/a/10424137/477420的回答)。
  • 管理多个大型内存流(即,用于多个用户)对于 x86 平台来说很有趣,而对于 x64 平台则没有那么重要。
  • 一些 API 根本不提供使用基于 Stream 的类的方法并且需要物理文件。
于 2012-05-04T16:18:42.810 回答
1

文件和流是相似的,是的。两者本质上都是流式传输byte数组……一个来自内存,一个来自硬盘。如果您使用的 API 允许您生成流,那么您可以轻松地执行此操作并将其提供给使用该Response对象的用户。

以下代码将获取一个 PowerPoint 内存对象(您需要针对自己的 API 对其进行修改,但您可以了解大致的想法),将其保存到 a MemoryStream,然后设置正确的标头并将流写入 Response(其中然后让用户将文件保存到他们的本地计算机):

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。

基本上,蒸汽只是一种处理大量数据的方式,您不必或不能一次将所有数据加载到内存中。因此,与其将整个数据集读取或写入到一个巨大的数组或其他东西中,不如打开一个流,它为您提供相当于游标的流。您可以将当前位置移动到流中的任何位置,并从该位置读取或写入。

于 2012-05-04T15:51:58.927 回答