2010-06-21 5 views
12

코어 데이터를 기반으로하는 응용 프로그램을 만들고 있습니다. 지금은 컨텍스트에서 엔터티를 추가하거나 삭제할 때 개체 컨텍스트를 저장하고 있습니다. 성능에 영향을 미칠지 모르니 저장을 지연시킬 생각입니다. 사실 응용 프로그램이 종료 될 때까지 모든 작업을 지연시킬 수 있습니다. 응용 프로그램을 닫을 때만 데이터를 저장하는 것이 너무 위험합니까? 얼마나 자주 개체 컨텍스트에서 저장을 호출해야합니까?얼마나 자주 코어 데이터에 저장해야합니까?

나는 별도의 스레드가 저장을 처리하도록 생각하고 있었다 : 그것은 세마포어를 기다릴 것이다. 응용 프로그램의 어느 부분이 코어 데이터를 저장하기 위해 helper/util 메소드를 호출 할 때마다, 그것은 세마포어를 감소시킬 것입니다. 0이되면 "save thread"는 한 번 저장을 수행하고 세마포어를 5로 증가시킨 다음 다시 잠자 게됩니다.

좋은 추천이 있습니까? 감사합니다.

답변

9

자주 저장해야합니다. 저장 조작의 실제 성능은 사용중인 지속적 저장 유형과 관련이 있습니다. 바이너리 및 XML 저장소는 원자 단위이기 때문에 모든 저장시 디스크에 완전히 다시 작성되어야합니다. 개체 그래프가 커지면 응용 프로그램 속도가 느려질 수 있습니다. SQLite 저장소는 점진적으로 쓰기가 훨씬 쉽습니다. 따라서 저장할 객체의 위에 쓰여지는 객체가있을지라도 오버 헤드는 원자 저장소 유형보다 훨씬 낮습니다. 일부 개체에만 영향을주는 저장은 전체 개체 그래프 크기에 관계없이 항상 빠릅니다.

즉, 루프에서 데이터를 가져 오는 경우 각 반복마다 저장하는 대신 저장 작업이 끝날 때까지 기다릴 수 있습니다. 기본 목표는 데이터 손실을 방지하는 것입니다. (나는 사용자가 그다지 신경 쓰지 않는다는 것을 발견했다!) 성능은 가까운 순간이어야한다. 저장 빈도와 성능의 균형을 맞추려면 약간의 작업을해야 할 수도 있지만 특정 성능 문제를 확인하지 않으면 위의 해결 방법은 과도한 것처럼 보입니다.

+0

빠른 답변 주셔서 감사합니다. 내 물건은 거대하지 않지만 대상은 약간 복잡합니다. 기본 저장소는 SQLite이므로 여러분이 말했듯이 꽤 괜찮습니다. 최근에 발생하는 추가 문제가 있습니다. 컨텍스트에서 엔티티 개체를 만들어 저장합니다. 짧은 순간에, (FetchedResultsController를 사용하여 나중에 검색 한) 엔티티를 삭제하면 Internal Consistency와 관련이있는 오류가 발생합니다. 컨텍스트가 메모리에있는 객체 그래프를 업데이트하지 않았기 때문이라고 생각합니다. – Justin

+1

실제 저장 빈도를 변수 또는'#define'으로 만들고 싶다면 일단 테스트를하면 저장 빈도를 미세 조정하고 Instruments에서 결과를 볼 수 있습니다. –

0

내가 생각하는 가장 좋은 방법은 모든 개체를 저장하는 것입니다. 갑작스러운 충돌과 같은 일이 발생하면 아무 것도 잃지 않습니다.

많은 성능 향상이 있습니다. 많은 개체를 추가하면 일괄 처리됩니다. 모든 오브젝트를 저장하는 것보다 컨텍스트에 추가하십시오. 루프에 많은 오브젝트를 추가하는 경우에 유용합니다. 당신의 생각은 비슷하지만, 프로그램이 충돌 할 수있는 절약 사이에는 오랜 시간이 걸릴 수 있습니다.

하나의 개체를 추가하는 것이 성능 문제가 될 것이라고 생각하지 않습니다. 개체의 크기가 얼마나 큽니까 많은 양의 데이터가 포함되어 있습니까?

+0

크래시가 발생하면 절대로 저장하지 마십시오. 그것은 죽은 연기를 죽인다. –

+1

모든 충돌 후 저장 하시겠습니까? 나는 그것이 오타라고 생각한다. 사용자가 개체를 만들어 저장 명령을 내리는 경우 사용자는 응용 프로그램의 속도를 느리게 할 정도로 빠르게 개체를 만들 수 없습니다. 응용 프로그램의 속도가 느려서 충분히 절약하지 못할 위험이 있다고 생각하는 경우 내 벤치 마크가 받아 들여질 수 있다는 증거를 제공해주십시오. –

관련 문제