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