【问题标题】:Reading large file - System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. in C#读取大文件 - System.OutOfMemoryException:引发了“System.OutOfMemoryException”类型的异常。在 C# 中
【发布时间】:2014-01-10 07:10:33
【问题描述】:

当我上传此文件时,我的文件名类似于“c3c81d9e-b390-4622-999c-eb74146afd10.dat”。 我不想更改上传逻辑。此文件大小为 1 GB。

我的问题是,当不同的用户同时下载同一个文件时,它会抛出异常 - System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown

我的代码如下。(C#)

string path ="E:\Projects\testsite\Inetpub\wwwroot\Downloads";

byte[] FileContents;

FileContents = File.ReadAllBytes(path);

但它给出了 System.OutOfMemoryException:抛出了“System.OutOfMemoryException”类型的异常。

我使用了以下堆栈溢出解决方案。

Reading large file using byte[] gives error

byte[] hashValue;
SHA1Managed hashString = new SHA1Managed();                            
using (FileStream f = File.Open(path, FileMode.Open))
{
  hashValue = hashString.ComputeHash(f);
  foreach (byte x in hashValue)
  {
    file.HexadecimalValue += String.Format("{0:x2}", x);
  }
}

但是这个file.HexadecimalValue 正在返回带有哈希值的字符串。 如何从file.HexadecimalValue 中提取数据并传递给HttpContext.Current.Response? 什么是最好的解决方案?

提前致谢

【问题讨论】:

  • File.ReadAllBytes 尝试将所有文​​件读入内存,所以不要将它用于大文件,使用与流一起使用的东西
  • 什么是file 变量?你的意思是f
  • 你应该使用一些缓存。这不仅可以消除您的记忆问题,而且速度也会快很多。
  • 我想知道你是否理解第二个代码被截断的作用。方法ComputeHash 计算散列(通过从流中逐字节或逐块读取),没有数据foreach 所做的是将散列值(字节)转换为字符串。而不是File.ReadAllBytes,您必须使用FileStream.Read 来读取部分内容,您可以将其保存在内存中。
  • 你好,看看我的解决方案,它会对你有所帮助....

标签: c#


【解决方案1】:

如果您不想更改逻辑,则必须检查两个选项。

  1. 列表项你的应用应该是64位的
  2. 您使用的是 .NetFramework 4.5(支持大对象)

这将使您的应用程序能够支持高达 2 GB 的超大对象。

您可以通过如下更改配置文件来启用大对象支持...

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <runtime>
      <gcAllowVeryLargeObjects enabled="true" /> 
    </runtime>
</configuration>

也许这会解决你的问题。

【讨论】:

  • 不,这已经是 32 位的了,因为在这个应用程序中我们使用了一些 ASP 屏幕。
  • 在这种情况下,您必须更改代码,而不是一次加载所有文件,而不是一次加载所有文件等。不更改代码并保持 32 位将无济于事
  • 你必须考虑 64 位,因为我知道在这种情况下你需要 64 位应用程序,而 32 位应用程序总是有内存消耗限制。
  • Sorry Nil ,它的 64 位应用程序
  • 好的,请您尝试第二个选项来启用大对象支持吗?
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2014-05-20
  • 2011-10-10
  • 2013-01-14
  • 2013-08-28
  • 2015-07-18
相关资源
最近更新 更多