如何从包含5000条记录的Excel文件中插入到documentDB中?

时间:2015-01-28 06:48:37

标签: c# database excel bulkinsert azure-cosmosdb

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

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

我发现了一些例外情况。

  

Microsoft.Azure.Documents.DocumentClientException:Exception:   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;
        }
}

我做错了吗? 任何帮助都会非常明显。

1 个答案:

答案 0 :(得分: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响应标头或RequestCharge / ResourceResponse对象返回的FeedResponse / x-ms-retry-after-ms属性来衡量任何操作(CRUD)的开销。 SDK。

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

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

参考文献: