2012-03-15 11 views
1

私は、これらの要件を満たしているJava用のNoSQLデータベースを探していませんよ:Java用のNoSQLデータベースの中で最も少ない設定量が必要ですか?

  • が完全に埋め込まれた(外部サーバを起動する必要はありません)
  • 必要はありません特別なセットアップ。理想的には、作業ディレクトリへのパスを与えるだけで動作するはずです。なしまたは部分的スキーマの
  • サポート:ユーザーは、(私が与えられていると思う)任意のJSONドキュメントを格納するための任意のドキュメントに
  • サポートに特殊フィールドを追加/削除することができなければならないが
  • データベースのサイズはおおよその1-なります10MB
  • クエリは、一致するドキュメントのためにtrueを返すJavaScriptコードになります。ピンチで
  • 、私はそれはあなたの選択私は成功したH2 DBを使用しました
+0

質問言語またはAPIを使用してjsonドキュメントを照会するように指定したい場合は、回答を見ても明らかではないようです。 – jgauffin

答えて

0

で作業するのがいかに「簡単に」あなたの個人的な意見を聞きたいと思います。かなり速くて使いやすいです。それはあなたの要件を満たす必要があります、ここではfeature comparison matrixです。

+0

さて、H2 CLOB列にデータを格納することで、独自のNoSQLデータベースを作成できたと思います。 -/ –

3

最後に可能な設定では、プレーンJavaですべてのことを行うことができます。個人的には、学び/維持するのが最も簡単です。

NoSQLライブラリを使用するために必要な要件をいくつか含めることができますか?ブルートフォーススキャンを行う

public class FileSystemNoSQL { 
    private final File basePath; 
    private final Map<String, String> documents = new TreeMap<String, String>(); 

    public FileSystemNoSQL(File basePath) { 
     this.basePath = basePath; 
     basePath.mkdirs(); 

     try { 
      for (File file : basePath.listFiles()) { 
       documents.put(file.getName(), FileUtils.readFileToString(file)); 
      } 
     } catch (IOException e) { 
      throw new IllegalStateException(e); 
     } 
    } 

    public String get(String key) { 
     return documents.get(key); 
    } 

    public void put(String key, String content) { 
     try { 
      FileUtils.write(new File(basePath, key), content); 
     } catch (IOException e) { 
      throw new IllegalStateException(e); 
     } 
     documents.put(key, content); 
    } 

    public Map<String, String> findKeyContains(String text) { 
     Map<String, String> set = new TreeMap<String, String>(); 
     for(Map.Entry<String, String> entry: documents.entrySet()) 
      if (entry.getKey().contains(text)) 
       set.put(entry.getKey(), entry.getValue()); 
     return set; 
    } 

    public Map<String, String> findContains(String text) { 
     Map<String, String> set = new TreeMap<String, String>(); 
     for(Map.Entry<String, String> entry: documents.entrySet()) 
      if (entry.getKey().contains(text) || entry.getValue().contains(text)) 
       set.put(entry.getKey(), entry.getValue()); 
     return set; 
    } 

    public static void main(String ... args) { 
     char[] spaces = new char[10240]; 
     Arrays.fill(spaces, ' '); 
     String blank10k = new String(spaces); 

     // build a database 
     long start1 = System.nanoTime(); 
     FileSystemNoSQL fileSystemNoSQL1 = new FileSystemNoSQL(new File(System.getProperty("java.io.tmpdir"), "no-sql")); 
     for(int i=0;i<1000;i++) { 
      fileSystemNoSQL1.put("key: "+i, "value: "+i + blank10k); 
     } 
     long time1 = System.nanoTime() - start1; 
     System.out.printf("Took %.3f seconds to build a database of 10 MB%n", time1/1e9); 

     // reload the database 
     long start2 = System.nanoTime(); 
     FileSystemNoSQL fileSystemNoSQL2 = new FileSystemNoSQL(new File(System.getProperty("java.io.tmpdir"), "no-sql")); 
     long time2 = System.nanoTime() - start2; 
     System.out.printf("Took %.3f seconds to load a database of 10 MB%n", time2/1e9); 

     // perform queries 
     long start3 = System.nanoTime(); 
     for(int i=0;i<1000;i++) { 
      Map<String, String> contains = fileSystemNoSQL1.findKeyContains("key: " + i); 
      if (contains.size() < 1) throw new AssertionError(); 
     } 
     long time3 = System.nanoTime() - start3; 
     System.out.printf("Took %.3f seconds to scan the keys of a database of 10 MB%n", time3/1e9); 

     long start4 = System.nanoTime(); 
     for(int i=0;i<1000;i++) { 
      Map<String, String> contains = fileSystemNoSQL1.findContains("value: " + i + ' '); 
      if (contains.size() != 1) throw new AssertionError(); 
     } 
     long time4 = System.nanoTime() - start4; 
     System.out.printf("Took %.3f seconds to brute force scan of a database of 10 MB%n", time4/1e9); 
    } 
} 

プリント

Took 0.171 seconds to build a database of 10 MB 
Took 0.088 seconds to load a database of 10 MB 
Took 0.030 seconds to scan the keys of a database of 10 MB 
Took 3.872 seconds to brute force scan of a database of 10 MB 

最悪のケースです。アプリケーション固有の索引を簡単に構築することができ、サブミリ秒までの時間を短縮できます。

+0

あらゆる種類のJSONを格納できる必要があります。私の文書は部分的にしか構造化されていないので、列/スキーマに基づくアプローチは意味をなさない。 –

+0

IMHO、最も簡単な方法は、ドキュメントをファイルに保存することです。彼らはあなたが好きなように非構造化することができます。あなたのデータセットは小さいので、私はそれらを再起動時にすべてメモリにロードします。あなたはそれらをインデックスに登録することができます。 0.1秒未満で10 MBのテキストをスキャンできるはずです。 –

関連する問題