2012-05-21 13 views
8

10億個のファイルを持つ外部ディスクがあります。コンピュータAに外部ディスクをマウントすると、私のプログラムはすべてのファイルのパスをスキャンし、ファイルのパスをデータベーステーブルに保存します。その後、外部ディスクを取り出すと、それらのデータはテーブルに残ります。問題は、コンピュータBでいくつかのファイルが削除され、それをコンピュータAに再度マウントした場合、コンピュータAでデータベーステーブルを同期する必要があるということです。ただし、すべてのファイルをスキャンする必要はありません多くの時間と多くのメモリを無駄にします。使用されるメモリを最小限に抑えながら、すべてのファイルをスキャンせずにデータベーステーブルを更新する方法はありますか?多数のファイルを扱います

さらに私の場合、メモリの制限は時間よりも重要です。つまり、私はむしろより多くの時間を節約するよりも多くのメモリを節約することを意味します。

私はこのセクションのファイルが削除されているかどうかをチェックするために、多くのセクションにファイルをカットし、いくつかの特定の機能(SHA1かもしれない)を使用することができると思います。しかし、私はセクションにファイルをカットする方法を見つけることができません。誰かが私を助けたり、より良いアイデアをくれますか?

+0

次のように削除:あなたが制御できないシステムベースの削除?またはあなたが何かできるアプリケーションでトリガされるAの削除? – Krrose27

+0

スキャン処理で大量のメモリが使用されるのはなぜですか?基本的には、一度に1つのディレクトリにファイルをリストするだけです。 – Joni

+0

しかし、私はディレクトリ上のファイル数を制御できません。 1つのディレクトリに10億のファイルがある可能性があります。また、ファイルをすぐにスキャンするときに1つのデータを挿入すると、多くのメモリが節約されますが、I/Oの問題のために時間がかかります。一括挿入を使用すると、より効率的です。 – s011208

答えて

0

理論的には、ディレクトリの「変更された」タイムスタンプをチェックすることで、速度を上げることができます。ディレクトリが変更されていない場合は、そのディレクトリ内のファイルを確認する必要はありません。残念ながら、可能なサブディレクトリをスキャンする必要があります。ディレクトリツリー構造を保存していない限り、ディレクトリをスキャンする必要があります。

もちろん、これは10億個のファイルを含むフラットなディレクトリを持っていることを意味しています。


データベースに問い合わせる前に並べ替えることができるように、すべてのファイルパスをメモリに組み立てていると思います。 (ソートするのは良い考えです...)しかし、メモリ内のソートの代替手段があります:

  1. ファイルパスをファイルに書き込みます。
  2. 外部ソートユーティリティを使用して、ファイルを主キー順にソートします。
  3. ソートされたファイルを読み取り、キー順にデータベースに対してバッチクエリを実行します。

(あなたが本当にディスク上億のファイルを持っていますか?それはあなたのデータストアの悪いデザインのように聞こえる...)

+0

私は10億のファイルを外付けディスクに入れることは決してありません。しかし、私はすべてのユーザーがそうしないと約束することはできません。 – s011208

+0

@ s011208 - うまくいけば、あなたのシステムがディスクにばかげた数のファイルを置いたときにシステムが長引くと、それが自分の責任であることをユーザーに伝えることになります。 –

1

ファイル・システムを制御していない場合ディスク上には、ディスク全体のファイル名をスキャンするしかありません。あなたはこのような何かを行うことができます削除されたファイル一覧表示するには:

update files in database: set "seen on this scan" to false 
for each file on disk do: 
    insert/update database, setting "seen on this scan" to true 
done 
deleted files = select from files where "seen on this scan" = false 

デシベルのパフォーマンスの問題を解決するには、いくつかの種類のリストにファイル名を蓄積することでしたし、いつでもあなた一括挿入/更新を行います1000個のファイルに到達します。

10億のファイルがあるディレクトリでは、ファイルをリストするコードを、Cの関数opendirreaddirを含むものに置き換えるだけです。もし私があなただったら、今はあまり心配しないだろう。そのようなことは、ファイルシステムと一般的なOSツールが壊れているため、危険性が低く、解決が容易なため、正直な人は1つのディレクトリに10億のファイルを持っていません。

+0

あなたの解決策はアンドロイドシステムが本当にやることです!しかし、この解決方法の欠点は、ファイルの属性をメモリに保存しなければならないということです。しかし、アンドロイドにはメモリの制限があります!あなたはわずか1万のファイルを持って、その罰金。 10万以上のファイルがある場合、プログラムは強制終了されます。私の質問と同じように、ディスクのすべてのファイルをセクションに切り分けて、一度にセクションを実行してメモリ制限の問題を避ける方法を見つけたいと思っています。 – s011208

+1

ファイルの属性をRAMに格納する必要があるのはなぜですか、それはデータベースのためです。または一括挿入に使用される一時的なリストを意味しますか?フィックスサイズを使用するのではなく、使用可能なメモリに基づいてバルクサイズを動的に選択できます... – Joni

0

削除が発生したときに削除されるもののリストがありますか(またはこれを作成するために削除するプロセスを変更しますか)?そうであれば、タイムスタンプを付けて「私は削除されました」というリストを表示できませんでした。そして、変更されたものだけを同期させるためにこのリストからアイテムを取り上げますか?当然ながら、あなたはサーバ上の遅い時間に同期するための何らかの種類のバッチジョブを必要としますが、負荷を減らすことができると思います。

コードを変更しているかどうかによっては、複数のノードがある場合は、そのプロセスが削除時に直接データベースを更新するオプションがあります。これは、システムにいくらかの結合を導入するが、それを行う最も効率的な方法であろう。

私の意見では、メッセージが削除されたというアイデアにはいくつかのバリエーションがあります(たとえそれが最近削除されたファイルのリストでどこに書き込むファイルであっても)アプリケーションが削除プロセスから直接使用する永続データストアを調整するだけで、コードを使用してコールバックメカニズムを実行できます。

このようなことがあっても、すべてが正しく一致していることを確認するために、インデックスの同期や定期的な正常性チェックが必要です。

あなたが持っているファイルの数に基づいていなければ、私はショックを受けます。たとえば、フォルダごとにファイルスペースを5,000〜10,000個のフォルダに分割して作成しますフォルダ内のすべてのファイル名のハッシュを持つ単純なファイル。これは、削除をキャッチしますが、私はまだ、削除が発生したときに何らかの形式の直接コールバックがはるかに良いアイデアだと思います。このようなすべてのモノリシックなフォルダがあれば、それを別のフォルダに分割するためのものを作成します(メインフォルダの下の単純な番号を使用して広告の邪魔になる可能性があります)。たとえあなたが新しいファイルのすべてに対してこれをして、古いファイルをそのままにしなければならないとしても、少なくとも、ファイルの取得時に出血を止めることができます。

私の意見では、ファイルのインデックスをプログラムで制御しているので、基本的なファイルシステムの変更時に変更が発生したときに、何らかの方法で(または通知された)起こるように変化し、次にすべてを見て更新を探します。当然のことながら、この通信が途絶えるアウトライアを捕まえるには、ファイルシステム内の内容を実際に確認し、定期的にインデックスを更新するための同期コードが必要です(ただし、これは主アプリケーション)。

0

メモリが重要な場合、私は運用システムの機能に行きます。

ext4をお持ちの場合、私はあなたがUnix上にいると推測します(Winなどの他のオペレーティングシステムでもfindをインストールできます)。これが当てはまる場合は、ネイティブのfindコマンドを使用することができます(これは最後のスキャンの時間を覚えておいて、好きなように修正することができます): find/directory_path -type f -mtime -1 -print

もちろん削除はありません。ヒューリスティックなアルゴリズムが機能する場合は、データベースに格納されている各ファイルにゆっくりと移動するスレッドを作成して(最初から新しいものから古いものに表示する必要があるものは何でも)、オンラインであることを確認できます。これは多くのメモリを消費しません。とにかく10億のファイルをユーザーに表示することはできません。

関連する問題