2012-03-16 22 views
0

私が(になることができるもの)のデータの合理的に大量に保存する必要があるデスクトップJavaアプリケーションを作成しています。私は当初自分自身のフォーマットを考えました:このデータを保存する最良の方法は何ですか?

id;name;value,value,value... 
id;name;value,value,value... 

無作為に読み書きできます。私の最初の考えはRandomAccessFileを使うことでした。しかし、任意の位置に挿入すると、データが上書きされるという問題が発生しました。など、それを復元し、一時的に格納し、一緒に既存のデータをシフトする方法を使用して

は、私はそれが高価になるので、かなり頻繁に書き込み/読み込みするつもりは特にため、悪い解決策のように思えます。私はこれがJava自体ではなく、根底にあるOSの限界だと読んだ。きれいに頻繁にアクセスして書き込むため、このようなデータを格納するための最良の方法だろう何

? SQLiteを使用して私の心を越えた。また、ID /名前ごとに1つのファイルを作成することも考えました。データ値はそれぞれ最後に付加されるだけなので、上書きされることはありません。

+1

これは、データベースがために作られたものです。ファイルの読み込み/書き込みを処理しようとするのは非常に遅く、ファイルを検索する必要がある場合は、パフォーマンスが大幅に向上します。これらをデータベースに格納すると、ID /名前でアクセスでき、ファイルへのアクセスを心配する必要はありません。 – jzworkman

+0

「かなり頻繁に」を定義します。どのようにデータを検索する必要がありますか?など)意味のあるアドバイスを提供することは困難です。この時点では、ファイルよりもキー/バリューDBのように見えます。 –

答えて

2

これを解決するためのデータベースを使用することは簡単です。本格的なデータベースは必要ありません。埋め込みデータベースを使用する方がよい。

データベースを使用して、このようなapache derbyberkely-db

+0

これは私が頭に入れていたアイデアなので、私はSQLiteを考えていたので、自立しています。私は一見、ありがとう:) – c24w

+1

@ c24w、imho、apache derbyまたはHSQL dbはjavaの方が適しています。また、[この議論](http://stackoverflow.com/questions/41233/java-and-sqlite)あなたの貢献のための –

0

私は、データベースを使用しようとするだろう。データを格納するためのデータベースが作成されます。彼らは本当に使いやすく、とてもシンプルです。私はMySQLを使いたい。それはデータベースにとっては本当に良いことです。

+0

元の質問ごとに、彼はすでにデータベース(SQLite)を検討していました。スタンドアロンのMySQLはデスクトップコンテキストでは比較的単純なスキーマ(これは@ringベアラのような組み込みDBを使う方が良い)にとっては確かに重すぎます。 – mjk

1

としてJVM組み込みデータベースを使用するには、ほとんどの提案された方法になるだろう。私は、あなたやあなたの将来の読者が簡単に素早くアクセスできるように中規模のデータを簡単に保存したい場合に、オプションの方法を紹介します。必要に応じて例外処理を調整してください。

public class PersistentMap extends HashMap<String, Object> implements Serializable { 
    private static final long serialVersionUID = 0x42424242; 
    private File file; 
    protected PersistentMap(File file) throws Exception { 
     this.file = file; 
     if (file==null || file.isDirectory()) { 
      throw new RuntimeException("ProgramCheck: "+file); 
     } 
     if (!file.exists()) { 
      if (file.getParent()!=null) { 
       new File(file.getParent()).mkdirs(); 
      } 
      save(); 
     } 
     restore(); 
    } 
    public void save() throws Exception { 
     FileOutputStream fos = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(this); 
     oos.close(); 
     fos.close(); 
    } 
    public void restore() throws Exception { 
     FileInputStream fis = new FileInputStream(file); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     super.putAll((Map<String,Object>)ois.readObject()); 
     ois.close(); 
     fis.close(); 
    } 
} 

使用法:

PersistentMap map = new PersistentMap(new File("myData\\data")); 
System.out.println(" "+map); 
map.put("yoyo","mama"); 
map.save(); 
System.out.println(" "+map); 

出力第一の実行:

{} 
{yoyo=mama} 

出力N番目の実行:

{yoyo=mama} 
{yoyo=mama} 
+0

感謝を参照してください。私はこれまでと似たようなことをやったことがありますが、頻繁な読み取り/書き込みを必要としないデータの場合、データの損失を防ぐために、多くの小さなデータを追加した後はコストがかかりません。 – c24w

+1

CPU%またはファイルI/Oに関して、ヒットは最小だと思います。実際のヒットはすべてのデータがメモリにあることです(これが速い理由です)。 JVMシャットダウンフックを追加して最後の保存を行うと、チェックポイントの保存が少なくて済みます。 – Java42

関連する問題