0

장치에로드하려는 항목의 목록이 있습니다. 응용 프로그램을 메모리에로드하려고 시도 할 때 응용 프로그램이 OutOfMemoryException이됩니다.
내 응용 프로그램은 500,000 items을로드하고 가능한 가장 빠른 방법으로 액세스해야합니다. 최종 사용자는 항목을 검색 한 후 목록에 있는지를 30 초간 기다리지 않으려 고합니다.
compact framework 3.5 I 무선을 사용할 수없고 해당 파일이 장치의 바이너리 파일로 존재합니다.Windows CE 6.0에 대한 C# OutOfMemoryException

나는 이걸 http://blogs.msdn.com/b/robtiffany/archive/2009/04/09/memmaker-for-the-net-compact-framework.aspx과 같이 필요로하지만 CE 6.0과 같은 방식으로 작동하지 않는 것 같습니다.

답변

3

휴대 기기에서 많은 데이터를 관리하려면 SQL Server Compact, SQLite 또는 Firebird Embedded과 같은 소형/라이트 데이터베이스를 사용해야합니다.

데이터를 직접 관리 할 수 ​​있지만 휠 재발견 중임을 알 수 있습니다. 기사에서 알 수 있듯이 메모리를 조정하는 대신 SQL Server Compact의 인덱싱 및 기타 기본 제공 메모리 관리를 사용하십시오. 당신이 묘사 한 것과 같은 룩업 (look-ups)은 그러한 엔진에 대해서는 사소한 것입니다.

2

귀하의 "가능한 빠른"재미 있습니다. 먼저 OOM을 분류해야합니다.

사용자는 한꺼번에 500K를 처리하고 싶지 않습니다.

Google의 예를 따르십시오. 귀하의 웹 검색은 수백만 건의 조회수를 반환하지만 한 번에 25 건을 우선 순위별로 정렬하여 반환합니다. 그것이 당신도해야 할 일입니다.

SQLite3 및 Google을 모방 한 데이터베이스를 사용하는 것이 좋습니다.

0

원시 이진 파일 인 경우 memory-mapped file으로 엽니 다. 운이 좋으면 "아이템"은 고정 너비이고 어떤 값으로 정렬되므로 바이너리 검색은 매우 빠르며 매핑에는 RAM이 64k에 불과합니다.

+0

좋은 기사, 불행히도 .Net Framework 3.5를 사용하고 있습니다. – AlphaDaemon

+0

메모리 매핑 된 파일은 CE에서 정상적으로 작동합니다. P/Invokes를 정의하기 만하면됩니다. 전체 CF 구현이 있지만 SO 응답에 게시하기에는 너무 큽니다. – ctacke