1

整数でインデックス付けされた多数のファイルを生成する必要があります。たとえば、int iの範囲が0〜10000であるとすると、生成されるファイルはf0.xml、f1.xml、...f10000.xmlになります。

ただし、ファイルシステムのパフォーマンスは、フォルダあたり1000ファイルを超えると低下し始めます。

iの値に対して「ハッシュ」または「スプレッド」関数を使用してファイルをディレクトリに保存したかったのです。この関数は、1つのディレクトリに1000個以下のファイル(またはフォルダ)を保存しますが、必要な場合にのみディレクトリを作成します。

私の問題に対するアイデアやオープンソースの解決策はありますか?ありがとう。

4

4 に答える 4

3

00000000 から 99999999 までの番号でファイル名を生成するとします。最後の 3 桁をファイル名として使用できます。つまり、ディレクトリは 00000/000.xml から 99999/999.xml のようになります。

注: SSD を使用していない場合、ファイル システムに多数のファイルがあると、パフォーマンスが低下します。通常のファイル アクセス時間は、HDD で約 8 ミリ秒です。

于 2012-08-28T11:06:08.837 に答える
1

簡単な解決策については、この優れた投稿を参照してください。

http://michaelandrews.typepad.com/the_technical_times/2009/10/creating-a-hashed-directory-structure.html

import java.io.File;

public class DirectoryHash {
    public static void main(String[] args) {
        String fileName = "cat.gif";

        int hashcode = fileName.hashCode();
        int mask = 255;
        int firstDir = hashcode & mask;
        int secondDir = (hashcode >> 8) & mask;

        StringBuilder path = new StringBuilder(File.separator);
        path.append(String.format("%03d", firstDir));
        path.append(File.separator);
        path.append(String.format("%03d", secondDir));
        path.append(File.separator);
        path.append(fileName);

        System.out.println(path);
    }
}
于 2014-03-07T16:48:07.057 に答える
0

これは、提供されたヒントのいくつかを使用して実装した方法です。最初に、3桁のセットの配列でインデックスを分解する関数:

private static void decompose(final long l, final short[] array) {
    long q = l;
    long r = 0;
    for (int j=array.length-1; j >= 0; j--) {
        // compute remainder
        r = q % 1000;
        // compute quotient
        // converts to int and fractional part is dropped without rounding
        q = q / 1000;

        array[j] = (short) r;
    }
}

次に、分解された配列(currentA)を使用して、サブディレクトリとファイルオブジェクトを作成します。

    File dir = parent;
    for (int j=0; j < depth-1; j++) {
        String dirName = String.format("%03d", currentA[j]);
        dir = new File(dir, dirName);
    }
    String fileName = prefix + String.format("%03d", currentA[depth]) + suffix;
    File file = new File(dir, fileName);
于 2012-09-13T16:59:29.400 に答える
0

ファイルの名前を取り、MD5のようなものを与えますabdefghijklmnop

これをディレクトリ構造とファイル名に分割します。

abc \ def \ ghi \ jkl \ mnop.txt

格納するファイルの数に基づいて、ディレクトリを分割する方法を選択できます (たとえば、例のように 3、3、3、3 の深さではなく、8 文字を 3、3、2 に分割するだけでよい場合があります)。その上)。

于 2012-08-28T11:02:13.177 に答える