レイジー ガベージ コレクションを実装する

最終更新日: 2009年10月1日

適用対象: SharePoint Foundation 2010

外部 BLOB ストアにある BLOB ファイル (アクティブなドキュメント、旧バージョン、およびごみ箱の中のドキュメントを含む) への参照が SharePoint Foundation に残っていない場合には、孤立したファイルを削除できます。それには、外部 BLOB ストアにある孤立ファイルの割合が使用中のアプリケーションに適した上限を超えたときに、孤立した BLOB に対してガベージ コレクションを実行します。

レイジー ガベージ コレクション

EBS Provider を使用しているときに外部 BLOB ストアに対してガベージ コレクションを実装するために実行する手順は次の通りです。いくつかの手順は、コード スニペットの例を挙げて特定のタスクを説明しています。ただし、コード例は簡略化されたもので、次の内容を前提としています。

  • 当該サイトに関する外部 BLOB ファイルはディレクトリに保存されている。

  • リストは、メモリ内のハッシュ テーブルで処理できるサイズである。

  • ガベージ コレクションを実行中は、新しい BLOB は作成されない。

上記の前提は実際に使用しているサイトの条件に合わない場合もありますので、各自の条件に合わせて例の内容を変更してください。

重要重要

以下の手順は、記載されている順番で実施してください。そうしない場合、問題のある競合状態を引き起こす可能性があります。

外部 BLOB ストアのガベージ コレクションを実装するには

  1. EBS Provider 名前空間にある BLOB ファイルのうち、指定された SPSite 識別子に対応するファイルをすべて列挙します。列挙した BLOB ファイルをハッシュ テーブルに追加します。

    String dirName = Utility.DirFromSiteId(site.ID);
    FileInfo[] files = Directory.GetFiles(dirName);
    foreach (FileInfo file in files)
    {
        ht.Add(file.Name, file);
    }
    
  2. コンテンツ データベース内のドキュメントのうち、SPSite 識別子に対応するドキュメントをすべて検索します。該当するエントリをハッシュ テーブルから削除します。

    foreach (SPExternalBinaryId blobid in site.ExternalBinaryIds)
      {
        String fileName = Utility.FileFromBlobid(blobid);
            if (ht.Contains(fileName))
            {
                ht.Remove(fileName);
            }
      }
    
  3. ハッシュ テーブルに残っているエントリは、外部 BLOB ストアにあるファイルのうち、コンテンツ データベースには対応するファイルがないものです。これらのファイルは孤立ファイルで、削除できます。

    foreach (FileInfo file in ht.Values)
      {
          file.Delete();
      }
    

関連項目

概念

孤立した BLOB を外部データ ストアから削除する

SharePoint Foundation でのバイナリ ラージ オブジェクト (BLOB) の外部保存

その他の技術情報

ILockBytes