0

私は Java の専門家ではありませんが、私が作成しているプログラムは高スループットを処理するものです。そこで、ちょっとクラウドソーシングして意見を集めてみようと思いました。これが状況です。

Java プロセスは、処理するファイルのディレクトリを監視します。これらのファイルはペアになります (格納されるデータ ファイルとメタ情報を含む xml ファイルがカタログ化されます)。そのため、現在のファイルのリストを取得し、必要なツインを確認してから処理する必要があります。

ファイルは常に一致するファイル名を持ち、ファイル拡張子のみが異なります。例: filename1.jpg filename1.xml filename2.jpg filename2.xml

これまで考えた選択肢は3つ。

  1. File.List(FileNamefilter) 呼び出しで FilenameFilter を使用して、ファイル名を持つファイルの総数が 1 より大きいかどうかを確認します。

  2. 2 つの filenamefilters を使用して、.xml を含むファイルと .xml を含まないファイルのリストを生成し、XML 以外のファイル リストを ArrayList に変換して、Collections.binarySearch() を呼び出します。

  3. .xml 拡張子のないすべてのファイルのリストを生成し、このリストを、ファイル名に基づいて .xml ファイルを想定するキーと値のペアのハッシュマップのキーとして使用します。次に、ハッシュ リストを実行し、処理する前に .xml ツインの存在を確認します。

何かご意見は?

編集/コメント

提案を確認し、いじくり回した後、XML ファイルをリストするファイルとリストしないファイルの 2 つの FilenameFilter を使用することにしました。XML ファイルのリストから xml 拡張子が取り除かれ、ハッシュにダンプされます。次に、データ ファイルのリストを繰り返し処理し、hashlist.contains() を呼び出して、続行する前にハッシュセットに一致するものが存在するかどうかを確認します。

不完全なファイルの処理については、次のような懸念があります。コメントで述べたように、新しく書き込まれたファイルは、その書き込みが完了するまで非書き込みプロセスには表示されないと想定しています(新しいファイル、編集用に開かれていません)

4

2 に答える 2

3

すべてのファイルを取得し、それらを並べ替えてから、ファイル名に対して線形パスを実行し、プレフィックスに一致するファイルを確認します。明らかに、それらはソートされたリストで互いに隣り合っている必要があります。

これは、フィルターやハッシュマップよりもはるかに簡単で高速です。

ディレクトリを監視するには、利用可能な場合は inotify などの通知ベース API を使用することをお勧めします。次に、フォルダーの内容が変更されたときにOSが通知します。

于 2012-05-17T17:14:35.557 に答える
0

これは少し話題から外れていますが、意図が述べられていることを考えると、ここに投稿するのに十分な関連性があることを願っています.

質問には、ファイルがディレクトリに到着する方法は記載されていません。それらがネットワークやインターネットを介して入ってくる場合、または別のプロセスからストリーミングされる場合、配信は瞬時に行われない可能性があり、まだ完全に配信されていないファイル (jpeg ファイルの半分など) を選択して処理するリスクにつながります。

スループットが高い場合は、それを許可すると、これが発生する状況になります。処理を少し遅らせたとしても、遅かれ早かれ何らかの形で処理が行われる可能性があります。

これに対処するための一般的な戦略は、中間のファイル名 (またはさらに良いのは、隣接するフォルダー) に配信することです。配信が完了すると、配信プロセスによってファイルの名前が変更されるか、ファイルが正しい名前と場所に移動されます。この移動は事実上インスタント (アトミック) です。ftp の場合、少なくとも 1 つのよく知られたツールがこれらの手順を自動的に実行します。

部分的に配信されたファイルが同じフォルダーにあり、別のファイル拡張子だけで名前が変更されている場合、これはこの質問で言及されているオプションのいくつかに影響を与える可能性があることに言及することはおそらくトピックです.

于 2012-05-17T19:23:46.253 に答える