c# - 将 POCO 列表转换为 JSON 序列化字符串列表
问题描述
背景: 我有一份将数据上传到 BigQuery 的工作,我希望加快速度。为了上传 API,需要序列化数据行的 IEnumerable,而不是标准的 json 数组。
问题: 我目前正在执行以下操作:
public async Task InsertCatalogItemsAsync(IEnumerable<CatalogItem> items)
{
//---THIS IS THE PART SLOWING ME DOWN---
IEnumerable<string> jsonItems = items.Select(i =>
{
var serializedItem = JsonSerializer.Serialize(i);
return serializedItem;
}).ToList();
//^^^^^^THIS IS THE PART SLOWING ME DOWN^^^^^
//upload to BigQuery
await _table.UploadJsonAsync(jsonItems);
}
但这运行有点慢,我正在寻找有关如何使其更快的任何想法。
更新 根据一些评论提供更多上下文,对于 1000 项的页面大小,以下是步骤和时间:
- 第一步:使用 Dapper 从 SQL Server 获取项目并将其加载到 POCO(约 1-2 秒)
- 第二步:将项目映射到新的 DTO(<1 秒)
- 第三步:遍历项目并将每个项目序列化为 json 字符串(30-40 秒)
- 第 4 步:上传到 BigQuery(约 1 秒)
我尝试了其他一些事情:
- @mjwillis 建议的 items.ToList() 。不到 1 秒就回来了。
- 我尝试在没有选择的情况下序列化整个对象,并且该过程花费了相似的时间(约 30 秒),所以我认为我可能无法加快速度
解决方案
我注意到当我运行该作业时,我的机器上的 CPU 利用率几乎没有上升,所以我决定并行运行序列化。该解决方案将序列化 1000 条记录的时间从 30-40 秒缩短到 8-9 秒。
public async Task InsertCatalogItemsAsync(IEnumerable<CatalogItem> items)
{
//---CHANGED THE SELECT STATEMENT TO RUN IN PARALLEL---
IEnumerable<string> jsonArray = items.AsParallel().Select(i =>
{
var serializedItem = JsonSerializer.Serialize(i);
return serializedItem;
}).ToList();
//upload to BigQuery
await _table.UploadJsonAsync(jsonArray);
}
推荐阅读
- firebase - 缩短的 Firebase 动态链接不适用于预填充的 Google 表单链接
- javascript - Wordpress Rest API - 使用 Backbone 客户端的无效随机数
- forms - 添加具有相同参考 ID 的附加记录
- excel - 如何在没有任何计算的情况下显示数据透视表
- excel - 使用一列更新另一列中的值
- azure - 可以在没有 RDP 连接的情况下更新 Azure VM(Windows Server)吗?
- java - 静止物体和运动物体之间的碰撞
- javascript - 如何使用javascript获取两个日期的月份数
- aws-sdk - 是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?
- prolog - 路径重复超过特定数量