3

我有一个最初有大约 200 行的 Excel 文件,我能够将 Excel 文件转换为数据表,并且所有内容都正确插入到 documentdb 中。

Excel 文件现在有 5000 行,在插入 30-40 条记录后没有插入,其余所有行都没有插入到 documentdb

我发现了一些异常,如下所示。

Microsoft.Azure.Documents.DocumentClientException:异常:Microsoft.Azure.Documents.RequestRateTooLargeException,消息:{“错误”:[“请求率很大”]}

我的代码是:

    Service service = new Service();
    foreach(data in exceldata) //exceldata contains set of rows
    {
    var student = new Student();
    student.id= "";
    student.name = data.name;
    student.age = data.age;
    student.class = data.class;
    student.id = service.savetoDocumentDB(collectionLink,student); //collectionlink is a string stored in web.config
    students.add(student);
    }

Class Service
{
 public async Task<string> AddDocument(string collectionLink, Student data)
        {
            this.DeserializePayload(data);
            var result = await Client.CreateDocumentAsync(collectionLink, data);
            return result.Resource.Id;
        }
}

我做错什么了吗?任何帮助都将不胜感激。

4

1 回答 1

4

更新

截止 2015 年 4 月 8 日,DocumentDB 发布了数据导入工具,支持 JSON 文件、MongoDB、SQL Server 和 CSV 文件。你可以在这里找到它:http: //www.microsoft.com/en-us/download/details.aspx?id=46436

在这种情况下,您可以将 Excel 文件保存为 CSV,然后使用数据导入工具批量导入记录。

原答案:

DocumentDB 集合每秒提供 2,000 个请求单位。重要的是要注意 - 限制以请求单位而不是请求表示;因此编写较大的文档比较小的文档花费更多,并且扫描比索引查找更昂贵。

x-ms-request-charge您可以通过检查HTTP 响应标头或SDK 返回的/对象中的RequestCharge属性来测量任何操作 (CRUD) 的开销。ResourceResponseFeedResponse

当您耗尽预置的吞吐量时,会引发 RequestRateTooLargeException。一些解决方案包括:

  • 遇到异常时,请稍作延迟并重试。x-ms-retry-after-msHTTP 响应标头中包含建议的重试延迟。或者,您可以简单地以短暂的延迟批量请求
  • 使用惰性索引以获得更快的摄取率。DocumentDB 允许您在集合级别指定索引策略。默认情况下,每次写入集合时都会同步更新索引。这使查询能够遵守与文档读取相同的一致性级别,而不会延迟索引“赶上”。惰性索引可用于在较长时间段内分摊索引内容所需的工作。然而,需要注意的是,当启用惰性索引时,无论为 DocumentDB 帐户配置的一致性级别如何,查询结果最终都会保持一致。
  • 如前所述,每个集合都有 2,000 个 RU 的限制 - 您可以通过跨多个集合和容量单元对数据进行分片/分区来提高吞吐量。
  • 删除空集合以利用所有预置吞吐量 - 在 DocumentDB 帐户中创建的每个文档集合都根据预置的容量单位 (CU) 数量和创建的集合数量分配保留的吞吐量容量。单个 CU 可提供 2,000 个请求单元 (RU) 并支持多达 3 个集合。如果只为 CU 创建一个集合,则整个 CU 吞吐量将可用于该集合。一旦创建了第二个集合,第一个集合的吞吐量将减半并分配给第二个集合,依此类推。为了最大限度地提高每个集合的可用吞吐量,我建议集合的容量单位数量为 1:1。

参考:

于 2015-01-28T07:47:51.797 回答