簡體   English   中英

使用Fog刪除Rackspace中的大量文件

[英]Delete a huge amount of files in Rackspace using fog

我的Rackspace文件中有數百萬個文件。 我想刪除其中的一部分,傳遞文件名列表,而不是一一刪除,這非常慢。 有什么辦法可以做到這一點? 現在,我有一個腳本來刪除每個文件,但是擁有更好的性能會很高興。

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

是的,您可以使用delete_multiple_objects

通過單個請求刪除多個對象或容器。

要刪除從一個單一的容器對象, container可以被提供並且object_names應該是在容器內的對象名稱的數組。

要從多個容器中刪除對象或刪除容器, container應為nil ,所有object_names均應以容器名作為前綴。

刪除后容器必須為空。 object_names是按給定的順序處理的,因此應首先列出容器中的對象以清空容器。

單個請求中最多可以刪除10,000個對象。 服務器將以200 OK響應所有請求。 response.body必須檢查實際結果。

示例:從容器中刪除對象

object_names = ['object', 'another/object']
conn.delete_multiple_objects('my_container', object_names)

從多個容器中刪除對象

object_names = ['container_a/object', 'container_b/object']
conn.delete_multiple_objects(nil, object_names)

刪除容器及其所有對象

object_names = ['my_container/object_a', 'my_container/object_b', 'my_container']
conn.delete_multiple_objects(nil, object_names)

據我所知,此處包含的算法是刪除雲文件容器及其包含的任何對象的最可靠,性能最高的算法。 可以為您的目的修改此算法,方法是包括一個帶有要刪除項目名稱的參數,而不是調用ListObjects 在撰寫本文時,尚沒有能夠及時滿足您需求的服務器端功能(即批量操作)。 批量操作的速率限制為每秒2-3個刪除操作,因此,每刪除10,000個項目至少需要55分鍾。

下面的代碼顯示了基本算法(與.NET SDK中實際需要的語法略有簡化)。 假定此方法開始執行后,在任何時候都沒有其他客戶端向容器添加對象。

請注意,您將被限制為每個包含文件的容器每秒最多進行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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM