2013-11-26 1 views
10

코어 데이터로 데이터를 가져오고 저장 작업이 느린 것을 확인하십시오. iOS 시뮬레이터를 사용하여 sqlite-wal 파일이 7GB가 넘을 때까지 성장하고 성장하는 것을 봅니다.핵심 데이터 sqlite-wal 파일은 ~ 5000 행을 삽입 할 때 대량 (> 7GB)이됩니다.

약 10 개의 필드로 약 5000 개의 레코드를 가져오고 있습니다. 이것은 많은 데이터가 아닙니다.

삽입하는 각 객체는 다양한 다른 객체 (6 개의 관계 전체)와 1 대 1의 관계가 있습니다. 합쳐진 기록은 모두 20 필드 미만입니다. 이미지 나 바이너리 데이터 또는 WAL 파일의 결과 크기가 왜 그렇게 큰지 알 수있는 어떤 것도 없습니다.

나는 wal 파일을 설명하는 sqlite 문서를 읽었으며 어떻게 될지 모르겠습니다. 원본 데이터는 50MB를 넘지 않습니다.

내 응용 프로그램이 멀티 스레드입니다. 가져 오기를 수행하는 백그라운드 스레드에 관리 대상 개체 컨텍스트를 만듭니다 (핵심 데이터 개체를 만들고 저장합니다).

코드를 작성하지 않고이 문제가 발생 했습니까? 누구든지 내가 조사해야 할 것에 대해 생각해 봤어. 코드는 매우 간단하지 않으며 모든 부분이 여기에 입력하는 데 시간이 걸리므로 일반적인 아이디어로 시작하십시오.

나는 올바른 방향으로 가고있는 사람을 신용 할 것입니다.

추가 정보 :

  • 나는 (나는 그것이 iOS에서 기본적으로 전무을 생각하지만 명시 적으로 전무로 설정)이 필요하지 않는 한 나는 상황을 위해 사용할 실행 취소 관리자를했습니다.
  • 전체 루프가 완료되고 모든 관리 객체가 RAM에있는 경우에만 저장을 호출합니다 (RAM은 최대 100MB btw).
  • 코어 데이터 객체의 루프 및 생성에는 5 초 정도 밖에 걸리지 않습니다. awl 파일을 쓰면 저장하는 데 약 3 분이 걸립니다.
+0

코드를 입력 하시겠습니까? – Shmidt

+0

필요한 경우 알려 드리겠습니다. 그러나 나는 정말로 아이디어를 먼저 찾고 있습니다. 래퍼 클래스와 다중 스레드를 사용하기 때문에 많은 코드가 호출됩니다. 이 동작은 sqlite 하위 시스템과 관련이있는 것으로 보입니다. 나는 그것이 내가하고있는 일이라고 확신한다. 누구에게도이 문제가 발생하지 않았다면 코드를 게시하고이 문제의 원인을 확인할 수 있습니다. –

+0

코어 데이터 SQL 디버깅을 켜서 실제로 실행중인 SQL을 확인해 보셨습니까? –

답변

9

WAL 저널 모드가 아닌 이전 롤백 (DELETE) 저널 모드를 사용해 보았습니다. 문제가 해결되었습니다. 경량 마이그레이션 으로 migratePersistentStore의 API를

  • 문제를 사용하는 경우 데이터베이스 마이그레이션와

    • 이 문제
    • 문제 : 다음과 같은 WAL 저널 모드를 사용할 때 다양한 문제가 될 것 같지 않습니다

      아마도 Core Data WAL 문제 페이지를 시작하고 포괄적 인 목록을 얻고 Apple에 버그 수정을 요청해야합니다.

      OS X 10.9 및 iOS 7의 기본 모드는 이제 WAL 모드를 사용합니다.다시 변경하려면 다음 옵션을 추가하십시오.

      @{ NSSQLitePragmaOptions : @{ @"journal_mode" : @"DELETE" } } 
      
  • 0

    트랜잭션의 변경된 모든 페이지가 -wal 파일에 추가됩니다. 여러 레코드를 가져 오는 경우 if possible은 가져 오기 전체에 대해 단일 트랜잭션을 사용해야합니다.

    일부 다른 연결이 데이터베이스를 읽는 동안 SQLite에서 전체 WAL checkpoint을 수행 할 수 없습니다 (닫지 않은 것을 잊어 버린 경우도 있음).

    +0

    코어 데이터 트랜잭션을 "닫는 것을 잊었습니까?" – Mundi

    +0

    나는 이것을한다. 나는 실제로 컨텍스트에 대해 실행 취소 관리자를 비활성화 했으므로 필요하지 않습니다 (기본적으로 iOS에서는 무효이지만 nil로 명시 적으로 설정했습니다). 전체 루프가 완료되고 모든 관리 개체가 RAM에있는 경우에만 저장을 호출합니다 (RAM은 최대 100MB btw까지 증가 함). 코어 데이터 객체의 루프 및 생성에는 5 초 정도 밖에 걸리지 않습니다. awl 파일을 쓰면 저장하는 데 약 3 분이 걸립니다. (주 질문에 이것을 더했습니다) –

    +0

    좋은 질문 먼디. 나는 sqlite 세계에서 "독자"가 데이터베이스에 열려 있다면 (db를 읽는 다른 스레드에서) db 파일에 쓰는 쓰레드는 WAL 파일에만 추가된다는 것을 이해한다. . 이것은 당연한 것입니다. WAL 파일이 7GB를 넘게되는 것은 아닙니다. 나는 SQL 디버그 출력을 검토하고있다. 계속 게시하십시오. –

    관련 문제