Пакетная вставка в таблице хранения Azure - PullRequest
0 голосов
/ 11 октября 2018

Я новичок в использовании таблицы хранения Azure.Я пытался вставить свои объекты в пакетном режиме, но обнаружил, что вы не можете выполнить пакетную операцию с другим ключом раздела.Есть ли способ, которым я могу сделать, что есть около 10 000 - 20 000 деталей файла, которые я хочу вставить в таблицу.Вот что я пробовал до сих пор: -

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; } }

}

Мой метод это в другом классе

  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);
    }

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Относительно нет способа вставить более одного объекта с одним и тем же ключом раздела с помощью пакетной операции.

Некоторые ограничения пакетных операций:

  • Все объекты в одной пакетной операции должны иметь один и тот же ключ раздела.
  • Одна пакетная операция может включать только 100 сущностей.

В качестве альтернативы вы могли бы вставлять сущности, используя "TableOperation.Insert ()", которая позволяет вставлять сущности с одним и тем же ключом разделения.

0 голосов
/ 11 октября 2018

Если вы хотите использовать пакетную операцию, объекты в пакете должны иметь одинаковый PartitionKey .К сожалению, в вашем случае нет другого выбора, кроме как сохранить их по отдельности.

Причина, по которой ключ раздела даже существует, заключается в том, что Azure может распределять данные между компьютерами без координации между разделами.Система спроектирована таким образом, что разные разделы не могут использоваться в одной и той же транзакции или операции.

Вы можете проголосовать за этот выпуск , чтобы ускорить реализацию этой функции.

...