我有大约 1,000,000 个 json 文件,我想每 30 分钟更新一次。更新只是将一个新数组附加到现有内容的末尾。
单个更新使用类似于以下的代码:
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
JObject jObject = null;
// If the blob exists, then we may need to update it.
if(blockBlob.Exists())
{
MemoryStream memoryStream = new MemoryStream();
blockBlob.DownloadToStream(memoryStream);
jObject = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(memoryStream.ToArray())) as JObject;
} // End of the blob exists
if(null == jObject)
{
jObject = new JObject();
jObject.Add(new JProperty("identifier", identifier));
} // End of the blob did not exist
JArray jsonArray = new JArray();
jObject.Add(new JProperty(string.Format("entries{0}", timestamp.ToString()),jsonArray));
foreach(var entry in newEntries)
{
jsonArray.Add(new JObject(
new JProperty("someId", entry.id),
new JProperty("someValue", value)
)
);
} // End of loop
string jsonString = JsonConvert.SerializeObject(jObject);
// Upload
blockBlob.Properties.ContentType = "text/json";
blockBlob.UploadFromStream(new MemoryStream(Encoding.UTF8.GetBytes(jsonString)));
基本上:
- 检查 blob 是否存在,
- 如果是,请下载数据并从现有详细信息创建一个 json 对象。
- 如果没有,则使用详细信息创建一个新对象。
- 将更新推送到 blob。
问题在于性能。我已经做了很多可以提高性能的事情(更新在五个并行线程中运行,并且我设置ServicePointManager.UseNagleAlgorithm
为 false。
它仍然运行缓慢。大约 100,000 次更新最多可能需要一个小时。
所以我想基本上,我的问题是:
- 我应该为此使用 Azure Blob 存储吗?(我愿意接受其他建议)。
- 如果是这样,对提高性能有什么建议吗?
注意:该文件基本上包含事件历史记录,我无法根据现有数据重新生成整个文件。这就是内容在更新之前被下载的原因。