1

我有大约 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)));

基本上:

  1. 检查 blob 是否存在,
  2. 如果是,请下载数据并从现有详细信息创建一个 json 对象。
  3. 如果没有,则使用详细信息创建一个新对象。
  4. 将更新推送到 blob。

问题在于性能。我已经做了很多可以提高性能的事情(更新在五个并行线程中运行,并且我设置ServicePointManager.UseNagleAlgorithm为 false。

它仍然运行缓慢。大约 100,000 次更新最多可能需要一个小时。

所以我想基本上,我的问题是:

  1. 我应该为此使用 Azure Blob 存储吗?(我愿意接受其他建议)。
  2. 如果是这样,对提高性能有什么建议吗?

注意:该文件基本上包含事件历史记录,我无法根据现有数据重新生成整个文件。这就是内容在更新之前被下载的原因。

4

0 回答 0