Muszę wykonywać operacje chronologicznie na ogromnych szeregach czasowych zaimplementowanych jako IList. Dane są ostatecznie przechowywane w bazie danych, ale nie ma sensu przesyłanie dziesiątek milionów zapytań do bazy danych.Plik mapowany w pamięci Implementacja IList, do przechowywania dużych zbiorów danych "w pamięci"?
Obecnie IList w pamięci wywołuje wyjątek OutOfMemory przy próbie przechowania ponad 8 milionów (małych) obiektów, chociaż musiałbym radzić sobie z dziesiątkami milionów.
Po przeprowadzeniu badań wygląda na to, że najlepiej będzie zapisać dane na dysku i uzyskać do niego dostęp za pomocą opakowania IList.
Memory-mapped files (wprowadzony w .NET 4.0) wydaje się być właściwym interfejsem do wykorzystania, ale zastanawiam się, jaki jest najlepszy sposób napisania klasy, która powinna implementować IList (dla łatwego dostępu) i wewnętrznie zajmować się plikiem mapowanym w pamięci.
Jestem również ciekawy, czy znasz inne sposoby! Myślałem na przykład o opakowaniu IList przy użyciu danych z db4o (someone mentionned here przy użyciu pliku odwzorowanego w pamięci jako IoAdapterFile, chociaż użycie db4o prawdopodobnie zwiększa koszt wydajności w porównaniu z bezpośrednią obsługą z plikiem mapowanym w pamięci).
Natknąłem się na this question zadawane w 2009 roku, ale nie przyniosło użytecznych odpowiedzi lub poważnych pomysłów.
są operacje wykonywane sekwencyjnie? czy korzystasz z całości danych naraz? – Yahia
Dostęp powinien być sekwencyjny (iteracja nad kolekcją, aby wykonać aktualizację), a także musi być w stanie usunąć/usunąć obiekty na drugim końcu. –
Baza danych to właściwe narzędzie do tego zadania. Aktualizuj dane w partiach, aby uniknąć zbyt wielu wywołań bazy danych. Możesz również zainteresować się przetwarzaniem stylu zmniejszającym mapę, aby trochę przyspieszyć. – dtb