Zwiększenie szybkości zapisu pliku

0

Cześć.
Zgodnie z moim nickiem chciałbym aby mój program zapisywał bardzo szybko duże obrazy do pamięci.
Np obraz o wielkości 8000x8000 aplikacja zapisuje w 1600 milisekund, a chciałbym aby wynik wynosił około 500 milisekund.

Aplikację testowałem na dwóch wariantach:
1.)

EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 75L);
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
image.Save(this.MyImage, jpegCodec, encoderParams);

Uwagi:

  • this.MyImage to atrybut klasy o typie MemoryStream
  • Zmniejszenie jakości zapisu nie zwiększyło prędkości.

2.)

image.Save(this.MyImage, ImageFormat.Jpeg);

Uwagi:

  • Prędkość wykonywania identyczna jak wyżej.

Ma ktoś może pomysł jak wykonać to szybciej? Około 500 milisekund byłoby świetne, ale poniżej jednej sekundy już jest i tak dobrze.
Niestety z podanymi wyżej kodami prędkość wynosi 1600 milisekund co jest niezadowalającym wynikiem.

Prosze o jakieś rady, kody lub cokolwiek co mogłoby mi pomóc.

0

Zależy ci na opóźnieniu czy przepustowości? Jeśli to drugie, to możesz po prostu odpalać kilka zapisów jednocześnie i jeśli procesor jest wielowątkowy to będzie to działać szybciej niż przy jednym zapisie (wątku) jednocześnie.

  • Zmniejszenie jakości zapisu nie zwiększyło prędkości.

Może zwiększyć co najwyżej nieznacznie. Współczynnik jakości to po prostu dzielnik przez który dzieli się wartości pikseli po transformacie DCT, a szybkość dzielenia w zasadzie nie zależy od dzielnika. Co najwyżej przy wyzerowaniu dużej ilości współczynników kodowanie Huffmana przyspieszyłoby, ale raczej nie miałoby to wielkiego wpływu na prędkość całego zapisu.

0

Wg. mnie niewiele mozesz zrobic, zwroc uwage jaki rozmiar ma ten pobraz w pamieci: 8000x8000x3 = 192000000B = 183.11MB (zakladajac ze nie masz kanalu alpha na obrazie to masz trzy skladowe r,g,b). Jedyne wyjscie to zmniejsz obraz o np. 500 pikseli z kazdej strony to dosc sporo zaoszczedzisz

0

Zależy mi na przepustowości, tak aby program nie dostawał dużej czkawki podczas zapisu. Sam zapis w aplikacji może odbywać się nawet co 500 milisekund, ale nie dłużej jak przez chwilę.

Myślałem o wątkach i w najgorszym razie tak to rozwiąże, ale być może ktoś ma pomysł jak zwiększyć wydajność.

0

Najpierw zobacz ile obciąża ci rdzeni podczas zapisywania.

0

Na razie mi jeden obciąża

0

ale tego nie jesteś w stanie przeskoczyć. Ogranicza Cię dostęp do dysku. O ile nie masz jakichś super szybkich dysków to nic z tym nie zrobisz. U mnie przy kopiowaniu z dysku na dysk (oba SATA II, płyta taka sobie + AV i normalnie działający system) mam średnią prędkość ~80MB/s. TO teraz sobie policz ile będzie trwał zapis 180MB.
Jedyne co możesz zrobić to zapisywać to w wątkach aby nie przymulało aplikacji i dodać do tego jakąś kolejkę. Ale jak Ci się RAM na kolejkę skończy to i tak leżysz i kwiczysz. Jak często dostajesz nowy obraz?

0

Przecież ja tego nie zapisuję na dysk. Przeczytaj dokładnie.

0

a jakikolwiek program graficzny zapisze grafikę 8000x8000 w pół sekundy? chyba nie widziałem
jedyną imo metodą na przyspieszenie byłoby przestudiowanie samemu zapisu jpg i dokonania optymalizacji dostosowanej do tego co zapisujesz
przykładowo jeżeli w tym obrazie zmienia się na raz tylko fragment obrazu a nie cały to można zapisywać tylko zmiany a resztę przekopiować z poprzedniej klatki

0
SpeedyGonzales napisał(a):

Przecież ja tego nie zapisuję na dysk. Przeczytaj dokładnie.

Temat wątku, który założyłeś brzmi "Zwiększenie szybkości zapisu pliku". Pliki zapisuje się na dysku. Zadawaj dokładnie pytania, a nie bawisz się z czytającymi w kalambury typu "MyImage jest typu MemoryStream". (TPO, MyImage to może być pole albo właściwość klasy, na pewno nie atrybut.)

Jeśli chcesz szybciej przetwarzać każdy pojedynczy obraz, to musisz zaimplementować szybszy algorytm.
Jeśli chcesz szybciej przetwarzać wiele obrazów, to zrób to w wątkach, w tym wypadku chyba prosto to będzie zrobić na Taskach.

0
abrakadaber napisał(a):

ale tego nie jesteś w stanie przeskoczyć. Ogranicza Cię dostęp do dysku. O ile nie masz jakichś super szybkich dysków to nic z tym nie zrobisz. U mnie przy kopiowaniu z dysku na dysk (oba SATA II, płyta taka sobie + AV i normalnie działający system) mam średnią prędkość ~80MB/s. TO teraz sobie policz ile będzie trwał zapis 180MB.
Jedyne co możesz zrobić to zapisywać to w wątkach aby nie przymulało aplikacji i dodać do tego jakąś kolejkę. Ale jak Ci się RAM na kolejkę skończy to i tak leżysz i kwiczysz. Jak często dostajesz nowy obraz?

JPG zajmie parę razy mniej niż BMP czy inny nieskompresowany format, więc dysk nie powinien być wąskim gardłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1