2013-12-17 3 views
0

이 질문은 다음과 유사합니다 : 나는 위키 피 디아의 XML 덤프에서 인덱스 특정 기능을 가지고스칼라 삽입 2.0 슬릭 및 sqlite3를 속도와 PRAGMA

. 파싱이 빠릅니다. 그러나 삽입이 느립니다.

인덱싱을 끄면 속도가 두 배로 향상되었습니다. 이 같은

I 일괄 삽입 :

articles.grouped(5000) 
      .foreach { 
       batch: IterableView[(Article, List[Category], List[Link]), Iterable[_]] => 
       //Save each batch in one transaction 
       database withTransaction { 
       implicit session => 
        for(i <- batch) { 
        articles += i._1 
        categories ++= i._2 
        links ++= i._3 
        } 

       } 
      } 

나는 journal_mode = MEMORYsynchronous = off가 삽입 속도를 빠르게 읽어 보시기 바랍니다. 나는 이것을 매끄럽게 어떻게 설정합니까? 연결 풀로 c3p0을 사용하고 PRAGMA journal_mode = MEMORYpreferredTestQuery에 추가했습니다. 이 옵션을 설정하는 것이 올바른 방법이라고 생각하지 않습니다.

도움 주셔서 감사합니다.

+0

이것은 [자주 묻는 질문] (HTTP이다. org/faq.html # q19); 모든 삽입에 대해 하나의 트랜잭션을 사용해야합니다. –

+0

이것은'withTransaction'이하는 일이나해야 할 일입니다. 모든 Wikipedia 기사에 대한 거래 하나가 너무 많을 수 있습니다. – Karsten

+0

"너무 많이"란 무엇을 의미합니까? 여러 트랜잭션이 확실히 너무 느립니다 ... –

답변

1

데이터를 로컬에서 한 번 읽는 것 같습니다. 거래를 전혀 사용하지 않고 withSession을 대신 사용할 수 있습니다. 그리고 여전히 프라그 마가 필요한 경우 일반 SQL을 통해 설정할 수 있습니다. 사용 후에 pragma를 재설정하여 부작용을 남기지 않으려 고합니다.

import scala.slick.jdbc.StaticQuery.interpolation 

database withSession { 
    implicit session => 
    sqlu"PRAGMA synchronous=OFF".execute 
    articles.grouped(5000) 
     .foreach { 
      batch: IterableView[(Article, List[Category], List[Link]), Iterable[_]] => 
       //Save each batch in one transaction 
       for(i <- batch) { 
       articles += i._1 
       categories ++= i._2 
       links ++= i._3 
       } 
      } 
} 

또한 알고 흥미뿐만 ​​아니라 데이터베이스도 withTransaction 방법 만 세션을 가지고 있다는 것입니다. 따라서 동일한 연결을 다시 사용하는 withSession 블록 내에서 session.withTransaction을 수행 할 수 있습니다. 슬릭 3.2.0에서

+0

'sqlu "PRAGMA ...".' 실행되었습니다. 나는'sql "PRAGMA ..."를 사용했다. 나는 단지 하나의 세션을 사용한다. – Karsten

+0

ca가 포함 된 하위 집합에서 테스트했습니다. 5500 개의 기사. 저널링 및 동기식을 전환하면 동기가 달라집니다. 그러나 foreach 밖에서'withSession '을 움직여도 큰 차이는 없습니다. 인덱싱이나 저널링이 없기 때문입니다. – Karsten

2

는 다음과 같은 라인이 제대로 작동 : org.sqlite부터입니다

import org.sqlite.SQLiteConfig 
import slick.jdbc.JdbcBackend.Database 
import slick.jdbc.SQLiteProfile.api._ 
... 
val sqliConfig = new SQLiteConfig(); 
sqliConfig.setJournalMode(SQLiteConfig.JournalMode.MEMORY) 
sqliConfig.setSynchronous(SQLiteConfig.SynchronousMode.OFF) 
val emailsDB = Database.forURL(
    "jdbc:sqlite:/path/to/my/dbfile.sqlite", 
    driver = "org.sqlite.JDBC", 
    prop = sqliConfig.toProperties 
) 

는 : //www.sqlite :

libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.16.1"