2012-03-16 5 views
0

합리적으로 많은 양의 데이터를 저장할 필요가있는 데스크톱 Java 응용 프로그램을 만들고 있습니다. 처음에는 내 형식을 생각해 냈습니다.이 데이터를 저장하는 가장 좋은 방법은 무엇입니까?

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

무작위로 일반 텍스트로 저장하고 읽고 쓸 수 있습니다. 나의 초기 생각은 RandomAccessFile을 사용하는 것이었다; 그러나 임의의 위치에 삽입 할 때 데이터 덮어 쓰기 문제가 발생했습니다.

기존의 데이터를 이동하고 일시적으로 저장하고 복원하는 등의 방법은 나쁜 해결책으로 보입니다. 특히 읽기/쓰기가 자주 발생하므로 비용이 많이 듭니다. 필자는 이것이 Java 자체보다는 기본 OS의 한계라고 읽었습니다.

잦은 액세스 및 기록을 위해 이러한 데이터를 깔끔하게 저장하는 가장 좋은 방법은 무엇입니까? SQLite 사용하여 내 마음을 넘어. 나는 또한 ID/이름 당 하나의 파일을 만드는 것을 생각해 보았습니다. 데이터 값은 각 끝에 대해 ​​끝에 추가되므로 아무 것도 덮어 쓰지 않습니다.

+1

이 데이터베이스가 만들어진 것입니다. 파일 읽기/쓰기를 처리하는 것은 매우 느리고 파일을 검색해야하는 경우 엄청난 성능 저하가 발생합니다. 데이터베이스에 저장하면 ID/이름으로 액세스 할 수 있으므로 파일 액세스에 대해 걱정할 필요가 없습니다. – jzworkman

+0

"꽤 자주"정의하십시오. 데이터에 대해 더 많이 알지 못하면 (관련성이 있습니까? Flat입니까? 항상 키/값입니까? 얼마나 많은 데이터가 있습니까? 어떻게 검색해야합니까? 등) 의미있는 조언을 제공하기가 어렵습니다. 이 시점에서 파일 (들) 이상으로 키/값 DB처럼 보입니다. –

답변

2

이 문제를 해결하기 위해 데이터베이스를 사용하기 쉽습니다. 본격적인 데이터베이스는 필요하지 않습니다. 내장 데이터베이스를 사용하는 것이 더 좋습니다.

는 데이터베이스가 대부분의 제안 방법이 될 것입니다 사용하여 JVM을 내장 데이터베이스와 같은 apache derby 또는 berkely-db

+0

이것은 내가 염두에 두었던 아이디어인데, 이것이 내가 SQLite를 생각한 이유입니다. 나는 모양, 감사합니다 :) – c24w

+1

@ c24w, imho, 아파치 더비 또는 HSQL DB는 자바에 더 적합합니다. 또한 [이 토론] (http://stackoverflow.com/questions/41233/java-and-sqlite) –

0

데이터베이스를 사용해 보겠습니다. 데이터를 저장하기위한 데이터베이스가 생성됩니다. 그들은 사용하기 쉽고 매우 간단합니다. 저는 MySQL을 사용하고 싶습니다. 데이터베이스에 정말 좋습니다.

+0

원래의 질문에 따르면 그는 이미 데이터베이스 (SQLite)를 고려하고있었습니다. 독립 실행 형 MySQL은 데스크톱 컨텍스트에서 이와 같이 상대적으로 간단한 스키마의 경우 거의 확실한 헤비급입니다 (@ring 무기명과 같은 내장 DB를 사용하는 것이 좋습니다). – mjk

1

를 사용합니다. 나는 당신이나 미래의 독자들이 잠깐 동안 빠른 접근을 위해 중간 크기의 데이터를 쉽게 저장하기를 원하는 선택적 방법을 보여줄 것입니다. 필요한 경우 예외 처리를 조정하십시오.

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); 

출력 1 실행 :

{} 
{yoyo=mama} 

출력 N 번째 실행 :

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

귀하의 기여에 감사드립니다. 전에도 이와 비슷한 일을했지만 빈번한 읽기/쓰기가 필요하지 않은 데이터의 경우 - 많은 작은 데이터 추가 (데이터 손실을 방지하기 위해) 이후에 값 비싼 호출 저장이 필요하지 않습니까? – c24w

+1

CPU % 또는 파일 I/O에 관해서는 히트가 적다고 생각합니다.진짜 타격은 모든 데이터가 메모리에 있다는 것입니다 (이것이 왜 그렇게 빠릅니다). JVM 종료 후크를 추가하여 마지막 저장을 수행하면 검사 점 저장 횟수를 줄일 수 있습니다. – Java42

관련 문제