C# 将大容量记录插入azure表存储时丢失记录

C# 将大容量记录插入azure表存储时丢失记录,c#,azure,asynchronous,azure-functions,azure-table-storage,C#,Azure,Asynchronous,Azure Functions,Azure Table Storage,我正在尝试使用azure函数将100K条记录从blob存储(制表符分隔的文件)插入azure表存储。插入这些记录是非常不可靠的。有时它会插入所有100K记录,有时甚至低至7500条记录。我很难理解为什么它不能插入其余的记录。我没有看到任何异常被抛出。这是我正在使用的代码。我不确定我在这里是否做错了什么。 当我在本地运行它时不会发生这种情况,但只有在函数发布时才会发生 [FunctionName("LargeFileProcessor")] public async Task Ru

我正在尝试使用azure函数将100K条记录从blob存储(制表符分隔的文件)插入azure表存储。插入这些记录是非常不可靠的。有时它会插入所有100K记录,有时甚至低至7500条记录。我很难理解为什么它不能插入其余的记录。我没有看到任何异常被抛出。这是我正在使用的代码。我不确定我在这里是否做错了什么。 当我在本地运行它时不会发生这种情况,但只有在函数发布时才会发生

[FunctionName("LargeFileProcessor")]
        public async Task Run([BlobTrigger("%InputContainer%/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
        {

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("AzureCloudSettings.StorageConnectionString"));

            // Create the blob client.
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            // Retrieve reference to a previously created container.
            CloudBlobContainer container = blobClient.GetContainerReference("adeptra");

            CloudBlockBlob cbb = container.GetBlockBlobReference(name);
            using (var memoryStream = new MemoryStream())
            {
                await cbb.DownloadToStreamAsync(memoryStream);
                string[] result = Encoding.
                  ASCII.
                  GetString(memoryStream.ToArray()).
                  Split(new string[] { Environment.NewLine }, StringSplitOptions.None);

                var largeFiles = new List<LargeFile>();
                foreach (var str in result)
                {
                    if (string.IsNullOrWhiteSpace(str.Trim())) continue;
                    var largeFile = MapFlatFile(str);
                    largeFiles.Add(largeFile);
                }
                //Delete the blob
                await cbb.DeleteAsync();
                for (int i = 0; i < largeFiles.Count; i += 100)
                {
                    var items = largeFiles.Skip(i).Take(100);
                    var success = await _service.BulkInsertLargeFileAsync(items);
                    if(!string.IsNullOrWhiteSpace(success))
                    {
                        throw new Exception("$Failed at loop i:{i} for reason :{success}");
                    }
                }
            }

        }

 public async Task<string> BulkInsertLargeFileAsync(IEnumerable<LargeFile> rows)
        {
            try
            {
                var largeFileEntity = _mapper.Map<IEnumerable<LargeFileEntity>>(rows);
                var result = await _largeFileDataProvider.BulkAddCommsTemplateAsync(largeFileEntity);
                return null;
            }
            catch (Exception exception)
            {
                return $"Exception at BulkInsertLargeFileAsync {exception.Message}";
            }
        }



public async Task<IList<TableResult>> BulkAddCommsTemplateAsync(IEnumerable<LargeFileEntity> templates)
        {
            return await _largeRepository.BatchInsertAsync(templates);
        }

public async Task<IList<TableResult>> BatchInsertAsync(IEnumerable<TEntity> rows)
        {
            TableBatchOperation batchOperation = new TableBatchOperation();

            foreach (var entity in rows)
            {
                batchOperation.InsertOrMerge(entity);
            }

            var result = await  _table.ExecuteBatchAsync(batchOperation);
            return result;
        }
[FunctionName(“LargeFileProcessor”)]
公共异步任务运行([BlobTrigger(“%InputContainer%/{name}”,Connection=“azureWebJobstorage”)]流myBlob,字符串名称,ILogger日志)
{
CloudStorageAccount-storageAccount=CloudStorageAccount.Parse(Environment.GetEnvironmentVariable(“AzureCloudSettings.StorageConnectionString”);
//创建blob客户端。
CloudBlobClient blobClient=storageAccount.CreateCloudBlobClient();
//检索对以前创建的容器的引用。
CloudBlobContainer容器=blobClient.GetContainerReference(“adeptra”);
CloudBlockBlob cbb=container.GetBlockBlobReference(名称);
使用(var memoryStream=new memoryStream())
{
等待cbb.下载到StreamAsync(memoryStream);
字符串[]结果=编码。
ASCII码。
GetString(memoryStream.ToArray()。
拆分(新字符串[]{Environment.NewLine},StringSplitOptions.None);
var largeFiles=新列表();
foreach(结果中的var str)
{
如果(string.IsNullOrWhiteSpace(str.Trim()))继续;
var largeFile=MapFlatFile(str);
添加(largeFile);
}
//删除blob
等待cbb.DeleteAsync();
对于(int i=0;i
-艾伦-

编辑:


如果我关闭azure函数中的“弹性向外扩展”选项(最小实例=1,最大突发=1),那么我可以看到结果是一致的(始终插入100K条记录)。

从表面上看,我认为您的代码看起来不错。您检查过存储分析日志吗?可能是因为表存储限制。您要写入多少个分区?限制为每个分区每秒2000个实体,最多每秒20000个实体。单个分区