在 Azure 存储中批量插入 table
Batch Insert in Azure storage table
我刚开始使用 Azure 存储 table。我试图批量插入我的实体,但我发现您无法使用不同的分区键进行批量操作。
有什么方法可以将大约 10,000 - 20,000 个文件详细信息插入 table.
这是我到目前为止尝试过的方法:
public class Manifest:TableEntity
{
private string name;
private string extension;
private string filePath;
private string relativePath;
private string mD5HashCode;
private string lastModifiedDate;
public void AssignRowKey()
{
this.RowKey = relativePath.ToString();
}
public void AssignPartitionKey()
{
this.PartitionKey = mD5HashCode;
}
public string Name { get { return name; } set { name = value; } }
public string Extension { get { return extension; } set { extension = value; } }
public string FilePath { get { return filePath; } set { filePath = value; } }
public string RelativePath { get { return relativePath; } set { relativePath = value; } }
public string MD5HashCode { get { return mD5HashCode; } set { mD5HashCode = value; } }
public string LastModifiedDate { get { return lastModifiedDate; } set { lastModifiedDate = value; } }
}
我的方法不一样class:
static async Task BatchInsert(CloudTable table, IEnumerable<FileDetails> files)
{
int rowOffset = 0;
var tasks = new List<Task>();
while (rowOffset < files.Count())
{
// next batch
var rows = files.Skip(rowOffset).Take(100).ToList();
rowOffset += rows.Count;
var task = Task.Factory.StartNew(() =>
{
var batch = new TableBatchOperation();
foreach (var row in rows)
{
Manifest manifestEntity = new Manifest
{
Name = row.Name,
Extension = row.Extension,
FilePath = row.FilePath,
RelativePath = row.RelativePath.Replace('\', '+'),
MD5HashCode = row.Md5HashCode,
LastModifiedDate = row.LastModifiedDate.ToString()
};
manifestEntity.AssignPartitionKey();
manifestEntity.AssignRowKey();
batch.InsertOrReplace(manifestEntity);
}
// submit
table.ExecuteBatch(batch);
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
如果要使用批量操作,批量中的实体必须具有相同的PartitionKey。不幸的是,除了在您的案例中单独保存它们之外别无选择。
分区键甚至存在的原因是 Azure 可以跨机器分布数据,而分区之间没有协调。该系统的设计使得不同的分区不能在同一事务或操作中使用。
您可以点赞issue以推进该功能的实现
相对而言,没有办法使用批处理插入多个没有相同分区键的实体。
批处理操作的一些限制是
- 单个批处理操作中的所有实体必须具有相同的分区
关键。
- 单个批处理操作只能包含 100 个实体。
或者,您可以使用“TableOperation.Insert()”插入实体,这样您就可以插入具有相同分区键的实体。
我刚开始使用 Azure 存储 table。我试图批量插入我的实体,但我发现您无法使用不同的分区键进行批量操作。
有什么方法可以将大约 10,000 - 20,000 个文件详细信息插入 table.
这是我到目前为止尝试过的方法:
public class Manifest:TableEntity
{
private string name;
private string extension;
private string filePath;
private string relativePath;
private string mD5HashCode;
private string lastModifiedDate;
public void AssignRowKey()
{
this.RowKey = relativePath.ToString();
}
public void AssignPartitionKey()
{
this.PartitionKey = mD5HashCode;
}
public string Name { get { return name; } set { name = value; } }
public string Extension { get { return extension; } set { extension = value; } }
public string FilePath { get { return filePath; } set { filePath = value; } }
public string RelativePath { get { return relativePath; } set { relativePath = value; } }
public string MD5HashCode { get { return mD5HashCode; } set { mD5HashCode = value; } }
public string LastModifiedDate { get { return lastModifiedDate; } set { lastModifiedDate = value; } }
}
我的方法不一样class:
static async Task BatchInsert(CloudTable table, IEnumerable<FileDetails> files)
{
int rowOffset = 0;
var tasks = new List<Task>();
while (rowOffset < files.Count())
{
// next batch
var rows = files.Skip(rowOffset).Take(100).ToList();
rowOffset += rows.Count;
var task = Task.Factory.StartNew(() =>
{
var batch = new TableBatchOperation();
foreach (var row in rows)
{
Manifest manifestEntity = new Manifest
{
Name = row.Name,
Extension = row.Extension,
FilePath = row.FilePath,
RelativePath = row.RelativePath.Replace('\', '+'),
MD5HashCode = row.Md5HashCode,
LastModifiedDate = row.LastModifiedDate.ToString()
};
manifestEntity.AssignPartitionKey();
manifestEntity.AssignRowKey();
batch.InsertOrReplace(manifestEntity);
}
// submit
table.ExecuteBatch(batch);
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
如果要使用批量操作,批量中的实体必须具有相同的PartitionKey。不幸的是,除了在您的案例中单独保存它们之外别无选择。
分区键甚至存在的原因是 Azure 可以跨机器分布数据,而分区之间没有协调。该系统的设计使得不同的分区不能在同一事务或操作中使用。
您可以点赞issue以推进该功能的实现
相对而言,没有办法使用批处理插入多个没有相同分区键的实体。
批处理操作的一些限制是
- 单个批处理操作中的所有实体必须具有相同的分区 关键。
- 单个批处理操作只能包含 100 个实体。
或者,您可以使用“TableOperation.Insert()”插入实体,这样您就可以插入具有相同分区键的实体。