Piszę bibliotekę klasy C#, aby przesyłać duże ilości danych przez automatyzację COM za pomocą IStream. Używa wywołania API CreateStreamOnHGlobal do utworzenia strumienia, a metody z nim związane są dostępne w ramach System.Runtime.InteropServices.COMTypes.IStream.Jaki jest właściwy sposób zarządzania dużymi kanałami IStream?
Moje pytanie brzmi: czy w przypadku przesyłania dużych ilości danych najlepszy jest sposób na kontrolowanie śladu pamięci? Załadowanie 100 MB danych z plików do pamięci wydaje się marnotrawstwem, a aplikacja kliencka musiałaby poczekać, aż proces ten zostanie ukończony przed pobraniem czegokolwiek.
Mój plan polegał na stworzeniu strumienia o rozsądnych rozmiarach i napisaniu do niego wiele razy. Przed napisaniem następnej porcji danych odszukaj początek i nadpisz od początku. Czy podążam tą drogą we właściwy sposób i czy istnieje lepsza metoda rozwiązania tego problemu?
Skąd pochodzą dane? Rzadko trzeba przechowywać * wszystko * w pamięci. Z pewnością możesz po prostu przeczytać ją w implementacji metody Read()? –
Z różnych źródeł, w tym tabel db i plików tekstowych. Kod biblioteki analizuje dane w tablicy bajtów i przesyła je do strumienia. Mogę pisać, czytać/pisać w małych porcjach, to nie jest problem. Problem polega na tym, że jak będę pisał na końcu strumienia, będzie on stale się powiększał, prawda? – polara
Prawdopodobnie najlepiej piszesz własną klasę, która implementuje interfejs IStream, wtedy możesz obsłużyć wywołania metody Read i załadować dane na żądanie, po przeczytaniu nie ma już potrzeby utrzymywania tych danych (zakładając, że nie pozwalasz IStream, aby był widoczny). – tyranid