개체 컬렉션을 관리하고 응용 프로그램 로컬 폴더에 저장하는 Windows 저장소 응용 프로그램이 있습니다. 이러한 객체는 JSON을 사용하여 파일 시스템에서 직렬화됩니다. 이러한 항목을 개별적으로 편집하고 유지할 수 있어야하므로 하나의 큰 파일 대신 각 개체의 개별 파일을 선택했습니다. 객체는이 패턴 다음 저장됩니다WinRT : 많은 양의 파일을 읽고 병렬 처리하는 데 너무 많은 시간이 걸립니다.
Local Folder
|
--- db
|
--- AB283376-7057-46B4-8B91-C32E663EC964
| |
| --- AB283376-7057-46B4-8B91-C32E663EC964.json
| --- AB283376-7057-46B4-8B91-C32E663EC964.jpg
|
--- B506EFC5-E853-45E6-BA32-64193BB49ACD
| |
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.json
| --- B506EFC5-E853-45E6-BA32-64193BB49ACD.jpg
|
...
각 객체 의지가 JSON 직렬화 된 객체 및 기타 최종 리소스가 포함되어 그 폴더 노드가 있습니다.
필자가 쓰기, 읽기, 삭제 테스트를 할 때 모든 것이 잘되었습니다. 복잡하게 된 부분은 응용 프로그램 시작시 대량의 객체 모음을로드하려고 할 때입니다. 나는 항목 1의 가장 큰 금액이 10000으로 저장할 것이라고 예상했다. 그래서 나는 10000 개의 항목을 쓴 다음 그것을로드하려고 시도했다. 응용 프로그램을 완료하는 데 3 분 이상 걸렸는데 물론 받아 들일 수 없다.
그럼 내 질문은 다음과 같습니다. 개체를 읽고 역 직렬화하기 위해 만든 코드에서 무엇이 최적화 될 수 있습니까? 페이징 시스템을 구현하여 내 WinRT 응용 프로그램에서 동적으로로드되도록하는 방법이 있습니까? 내 저장 방법 (위의 패턴)이 IO/CPU의 측면에서 너무 무겁습니까? WinRT에서 뭔가 빠졌습니까?
public async Task<IEnumerable<Release>> GetReleases()
{
List<Release> items = new List<Release>();
var dbFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(dbName, CreationCollisionOption.OpenIfExists);
foreach (var releaseFolder in await dbFolder.GetFoldersAsync())
{
var releaseFile = await releaseFolder.GetFileAsync(releaseFolder.DisplayName + ".json");
var stream = await releaseFile.OpenAsync(FileAccessMode.Read);
using (var inStream = stream.GetInputStreamAt(0))
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Release));
Release release = (Release)serializer.ReadObject(inStream.AsStreamForRead());
items.Add(release);
}
stream.Dispose();
}
return items;
}
도움 주셔서 감사합니다.
NB : 이미 SQLite로 보였으 나 이러한 정교한 시스템이 필요하지 않습니다.
WinRT에서 사용할 수있는 바이너리 직렬화가 없다고합니다. 나는 이것을지지하는 도서관을 찾으려고 노력할 것이다. Json.Net을 테스트 한 결과 로딩시 20 %의 성능 향상을 보았습니다. 따라서 매우 고무적이었습니다! 나는 데이터베이스와 같이 개별적으로 작성 될 수 있기 때문에 내 객체의 원 자성과 비슷합니다. 목록에 직렬화하면 파일 시스템 IO 오버 헤드가 조금씩 제거되지만 직렬화에서는 더 빨리 수행되지 않습니다. – Ucodia