【问题标题】:C# Large JSON to string causes out of memory exceptionC# Large JSON to string 导致内存不足异常
【发布时间】:2014-12-23 08:05:05
【问题描述】:

我正在尝试下载非常大的 JSON 文件。但是,我不断收到一条错误消息:

“在 mscorlib.dll 中发生了“System.OutOfMemoryException”类型的未处理异常”

{函数评估因内存不足异常而被禁用。}

有什么技巧可以下载这个大的 JSON 文件吗?我曾尝试使用字符串和 StringBuilder 但没有运气。

这是我的代码:

public static string DownloadJSON(string url)
{
 try
 {
   String json = new WebClient().DownloadString(url); // This part fails!
   return json;
 }
 catch (Exception)
 {
  throw;
 }
}

我已经创建了控制台应用程序。我已经用较小的 JSON 文件尝试了这段代码,它工作正常。 我的想法是稍后拆分这个较大的 JSON 文件并将其放入数据库。但是,我需要先对其进行编码,然后才能将其放入数据库。我还没有写数据库部分或其他任何东西,因为下载这个大 JSON 会导致问题。我不需要它作为流,但这是我进行编码的示例方式。我需要对其进行编码,因为数据具有特殊字符,例如 å。

我也试过这个但同样的问题:

var http = (HttpWebRequest)WebRequest.Create(url);
            var response = http.GetResponse();

            var stream = response.GetResponseStream();
            var sr = new StreamReader(stream);
            var content = sr.ReadToEnd();

【问题讨论】:

  • 为什么需要它作为流?你为什么使用Encoding.Unicode? (对于 ASCII 文本,它将是 UTF-8 的两倍。)文本有多大?之后你用它做什么?为什么你有一个 try/catch 块,你只是在重新抛出?
  • 我不确定它有多大...我如何测量它?我可以使用浏览器打开它,但是...
  • 你能把它收集为流而不是字符串吗?尝试 OpenRead 而不是 DownloadString。
  • 你能举个例子吗?

标签: c# json string out-of-memory


【解决方案1】:

我假设您的反应非常非常大。最好处理流。现在来指出导致内存不足的原因。

  • .net 中任何对象的最大大小为 2GB。这甚至适用于 64 位机器。如果您的机器是 32 位的,那么这个限制非常低。

在您的情况下,上述规则会中断,因此它将无法正常工作,但如果您的文件大小小于该大小,则尝试针对 64 位构建代码,它会给出您的结果。

【讨论】:

  • 谢谢,我针对 64 位重建了我的代码,现在它可以工作了! =) 但是,如果我想使用更高版本的 32 位,处理 450MB JSON 文件的最佳方式是什么?
  • 450 MB 文件可以用 32 位处理,但问题是您的程序除此之外还有许多其他事情。我建议一种构建控制台应用程序的解决方案,它只需下载 json 文件并从您的启动进程现有应用程序,因此新进程有自己的内存空间,因此它会下载该文件,稍后您可以修改该文件,但这仍然取决于您当前程序的工作方式。
【解决方案2】:

将其下载到文件中:

using (WebClient webClient = new WebClient())
{
    webClient.DownloadFile(
        url,
        path);
}

当然,如果 JSON 库太大而无法在内存中打开,则它可能无法处理,但如果您没有选择并且文件必须太大,您可以尝试以某种方式处理它。

【讨论】:

  • 谢谢,我用你的例子下载了。文件大小是 450MB,所以没有我想象的那么大。但大到足以给我带来麻烦。
猜你喜欢
  • 2016-02-22
  • 2012-12-15
  • 1970-01-01
  • 2011-05-26
  • 2013-06-22
  • 2013-12-09
  • 2014-03-26
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多