2013-10-17 2 views
2

neo4j를 사용하여 메모리 데이터베이스를 생성하는 올바른 방법입니까? 따라서 트래버스 쿼리는 디스크가 아닌 캐시에만 적용됩니다.메모리 데이터베이스에서 만드는 가장 좋은 방법은 무엇입니까?

방법 - 1 :이 함께 노력 :

package com.test; 

import org.neo4j.graphdb.GraphDatabaseService; 
import org.neo4j.graphdb.factory.GraphDatabaseFactory; 
import org.neo4j.kernel.impl.util.FileUtils; 

import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

public class CreateDBFactory { 

    private static GraphDatabaseService graphDb = null; 
    public static final String DB = "test/db"; 

    public static GraphDatabaseService createInMemoryDB() { 
     System.out.println("- Inside createInMemoryDB() - "); 
     if (null == graphDb) { 
      synchronized (GraphDatabaseService.class) { 
       if (null == graphDb) { 
        System.out.println(" - Inside if clause -"); 
        final Map<String, String> config = new HashMap<>(); 
        config.put("neostore.nodestore.db.mapped_memory", "50M"); 
        config.put("string_block_size", "60"); 
        config.put("array_block_size", "300"); 
        graphDb = new GraphDatabaseFactory() 
         .newEmbeddedDatabaseBuilder(DB).setConfig(config) 
         .newGraphDatabase(); 

        registerShutdownHook(graphDb); 
       } 
      } 
     } 
     return graphDb; 
    } 

    private static void registerShutdownHook(final GraphDatabaseService graphDb) { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       graphDb.shutdown(); 
      } 
     }); 
    } 

    public static void clearDb() { 
     try { 
      if (graphDb != null) { 
       graphDb.shutdown(); 
       graphDb = null; 
      } 
      FileUtils.deleteRecursively(new File(DB)); 
      } catch (final IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

접근 -2 : 사용 Neo4jBasicDocTest 클래스를.

여기서 new ImpermanentDatabaseBuilder()은 대상/test-data/impermanent-db 폴더를 만들지 않습니다. 그래서 "Nancy"노드를 테스트 할 수 없게됩니다.

답변

5

Neo4j는 항상 메모리에 저장되는 모든 데이터와 디스크 스토리지가 사용되지 않는다는 점에서 '메모리 있음'모드가 없습니다. ImpermanentGraphDatabase은 이와 비슷한 것으로 가장 가까이에 있지만 데이터 디렉토리를 무작위로 생성하고 종료 할 때 삭제합니다.

디스크를 사용해도 괜찮 으면 위의 ImpermanentGraphDatabase을 사용하고 neo4j의 캐시를 정말로 높게 설정하면됩니다. 이렇게하면 모든 것이 디스크뿐만 아니라 메모리에도 저장됩니다.

+0

Nicholas에게 감사드립니다. :) 내가 알고 싶은 한 가지 - 위의 단계를 수행 한 후 쿼리를 실행하면 메모리와 디스크를 먼저 살펴 본다. 그렇지? 첫 번째는 메모리 캐시가 사용된다는 의미입니다. – Abhi

+0

예. Neo4j는 먼저 캐시에 도달하고 존재하지 않으면 디스크에 도달합니다. – Nicholas

관련 문제