gpt4 book ai didi

azure - Azure 上的大 JSON 流

转载 作者:行者123 更新时间:2023-12-03 01:42:45 24 4
gpt4 key购买 nike

我正在开发一个大数据导出 API,但当它需要以 JSON 形式传输大数据时,我遇到了问题。一个例子是传输超过 400 万条记录。当保存为文本文件时,数据应该约为 380MB,但由于某种原因,流被缩短为约 250-280MB(总是不同),当我在记事本中检查文件时,它只是截断了中的数据记录的中间。

此行为仅发生在 Azure 服务器上,我可以通过本地 IIS 下载完整文件。同样奇怪的是,当我将数据导出为 XML 时(结果是 +600MB 的更大文件),却没有出现此问题。

我们的Azure应用程序服务计划是S3(4核,7GB内存),我认为应该足够了,实际传输数据的代码是以下函数:

public IActionResult ResponseConvert(IList data)
{
return new Microsoft.AspNetCore.Mvc.JsonResult(data);
}

数据参数是List<dynamic>对象,包含超过 400 万条记录。

乍一看,Azure 似乎提前终止了流,知道为什么以及如何防止这种情况吗?

最佳答案

最后,我编写了自己的 JsonResult 类,它将使用 JsonTextWriter 来传输数据。这似乎适用于较大的对象,甚至在 Azure 上也是如此。

这是完整的类(class):

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Text;

namespace MyProject.OutputFormat
{
public class JsonResult : ActionResult
{
private readonly IList _data;

public Formatting Formatting { get; set; }
public string MimeType { get; set; }

public JsonResult(IList data)
{
_data = data;


// Default values
MimeType = "application/json";
Formatting = Formatting.None;
}

public override void ExecuteResult(ActionContext context)
{
context.HttpContext.Response.ContentType = MimeType;
using (var sw = new StreamWriter(context.HttpContext.Response.Body, Encoding.UTF8))
{
using (var writer = new JsonTextWriter(sw) { Formatting = Formatting })
{
writer.WriteStartArray();
if (_data != null)
{
foreach (var item in _data)
{
writer.WriteStartObject();
if (item is ExpandoObject)
{
foreach (KeyValuePair<string, object> prop in item as ExpandoObject)
{
writer.WritePropertyName(prop.Key);
writer.WriteValue(prop.Value != null ? prop.Value.GetType().Name != "Byte[]" ? prop.Value.ToString() : ((byte[])prop.Value).BinaryToString() : null);
}
}
else
{
var props = item.GetType().GetProperties().Where(i => i.Name != "Item");
foreach (var prop in props)
{
var val = prop.GetValue(item);
writer.WritePropertyName(prop.Name);
writer.WriteValue(val != null ? val.GetType().Name != "Byte[]" ? val.ToString() : ((byte[])val).BinaryToString() : null);
}
}
writer.WriteEndObject();
}
}
writer.WriteEndArray();
}
}
}
}
}

你看到的BinaryToString()方法是对byte[]的自写扩展,用于将字节数组转换为base64字符串。

小提示,虽然这适用于更大的数据,但 Microsoft.AspNetCore.Mvc 中的 JsonResult 下载速度更快。获得对客户端的响应同样快,但由于此方法仅在下载期间进行转换,因此需要更长的时间才能完全下载流。如果您的环境没有任何问题,我建议使用 Microsoft.AspNetCore.Mvc 中的问题。

关于azure - Azure 上的大 JSON 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51134419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com