1

Rackspace ファイルに何百万ものファイルがあります。1つずつ削除するのではなく、ファイル名のリストを渡して、それらの一部を削除したいと思いますが、これは非常に遅いです。霧でこれを行う方法はありますか?現在、各ファイルを削除するスクリプトがありますが、よりパフォーマンスの高いものがあればいいと思います。

connection = Fog::Storage.new({
  :provider           => 'Rackspace',
  :rackspace_username => "xxxx",
  :rackspace_api_key  => "xxxx",
  :rackspace_region   => :iad  
})

dir = connection.directories.select {|d| d.key == "my_directory"}.first

CloudFileModel.where(duplicated: 1).each do |record| 
    f = record.file.gsub("/","")
    dir.files.destroy(f) rescue nil
    puts "deleted #{record.id}"
end
4

2 に答える 2

0

私の知る限り、ここに含まれるアルゴリズムは、Cloud Files コンテナーとそれに含まれるオブジェクトを削除するための最も信頼性が高く、最高のパフォーマンスのアルゴリズムです。を呼び出す代わりに、削除するアイテムの名前をパラメーターに含めることで、目的に合わせてアルゴリズムを変更できますListObjects。これを書いている時点では、タイムリーにニーズを満たすことができるサーバー側の機能 (つまり、一括操作) はありません。一括操作は、1 秒あたり 2 ~ 3 回の削除操作にレート制限されているため、削除するアイテム 10,000 件あたり少なくとも 55 分です。

次のコードは、基本的なアルゴリズムを示しています (.NET SDK で実際に必要な構文から少し簡略化しています)。このメソッドの実行が開始された後の任意の時点で、他のクライアントがコンテナにオブジェクトを追加していないことを前提としています。

ファイルを含むコンテナーごとに、1 秒あたり最大 100 の削除操作にレート制限されることに注意してください。複数のコンテナーが関係している場合は、同時要求を分散して、要求を各コンテナーにラウンドロビンします。ハード レート制限に近づく値に同時実行レベルを調整します。このアルゴリズムを使用することで、複数のコンテナーが関係している場合に、450 オブジェクト/秒を超える長期持続削除率に到達することができました。

public static void DeleteContainer(
  IObjectStorageProvider provider,
  string containerName)
{
  while (true)
  {
    // The only reliable way to determine if a container is empty is
    // to list its objects
    ContainerObject[] objects = provider.ListObjects(containerName);
    if (!objects.Any())
      break;

    // the iterations of this loop should be executed concurrently.
    // depending on connection speed, expect to use 25 to upwards of 300
    // concurrent connections for best performance.
    foreach (ContainerObject obj in objects)
    {
      try
      {
        provider.DeleteObject(containerName, obj.Name);
      }
      catch (ItemNotFoundException)
      {
        // a 404 can happen if the object was deleted on a previous iteration,
        // but the internal database did not fully synchronize prior to calling
        // List Objects again.
      }
    }
  }

  provider.DeleteContainer(containerName);
}
于 2014-08-01T15:11:50.930 に答える