• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wczytywanie pliku z archiwum zip do byte[] w wydajny sposób

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
437 wizyt
pytanie zadane 1 stycznia 2022 w C# przez milosz263 Nowicjusz (240 p.)

Aktualnie używam tej funkcji (oraz biblioteki System.IO.Compression) do tego zadania, Niestety wymaga ona przechowania w pamięci 3 kopii danego pliku podczas wczytywania. Jest to uciążliwe przy wczytywaniu większego pliku, w tym wypadku załadowanie pliku ~1,2GB wymaga 3.3GB pamięci oraz powoduje 6 wywołań GC. Czy jest jakaś wydajniejsza metoda na wczytywanie danych? Mogę użyć innej biblioteki, ale ta akurat była najlepiej udokumentowana.

using System.IO;
using System.IO.Compression;
//...
private static byte[] LoadFile(ZipArchive source, string filename)
{
    using var stream = source.GetEntry(filename).Open();
    using var ms = new MemoryStream();
    stream.CopyTo(ms);
    return ms.ToArray();
}

Przykład zużycia pamięci z debuggera Visual Studio.

2 odpowiedzi

+1 głos
odpowiedź 1 stycznia 2022 przez adrian17 Mentor (351,140 p.)
wybrane 1 stycznia 2022 przez milosz263
 
Najlepsza

Tak na oko (nie odpalałem), to coś takiego?

	private static byte[] LoadFile(ZipArchive source, string filename)
	{
		var entry = source.GetEntry(filename);
		using var stream = entry.Open();
		
		byte[] buffer = new byte[entry.Length];
		stream.Read(buffer, 0, (int)entry.Length);
		return buffer;
	}

 

komentarz 1 stycznia 2022 przez milosz263 Nowicjusz (240 p.)
Chyba działa. Mój testowy plik wczytał się bezbłędnie, aplikacja zajmuje w RAMie tyle, ile powinna (czyli 1,2gb + ~50mb na resztę testowego kodu), oraz GC nie jest ani razu wywołany. Dzięki za pomoc!
EDIT: wczytanie 100 000 małych plików też nie sprawia problemu, kod wykonuje się tyle samo czasu co "oryginał".
–2 głosów
odpowiedź 1 stycznia 2022 przez Wiciorny Ekspert (278,710 p.)

No co się dziwić jak sam konwertujesz to do tablicy z metody toArray to nie będzie optymalne, też po co tworzysz memory stream ? 
 

byte[] data = File.ReadAllBytes("D:\z.7z");

Masz do tego optymalną i gotową metode https://docs.microsoft.com/pl-pl/dotnet/api/system.io.file.readallbytes?view=net-6.0

Koła się na nowo nie wymyśla, bo nie jest to potrzebne

1
komentarz 1 stycznia 2022 przez adrian17 Mentor (351,140 p.)
To co wrzuciłeś to bajty całego archiwum, a on czyta konkretny plik z archiwum.
1
komentarz 1 stycznia 2022 przez Wiciorny Ekspert (278,710 p.)

dobrze, ale równie dobrze może tam być link do pliku ....  np tekstowego 

byte[] newdata = File.ReadAllBytes("D:\t.txt");

aj, dobra po-noworoczne zwolnienie, zwracam honor, rozumiem  zauważyłem dopiero entry...  

Podobne pytania

0 głosów
0 odpowiedzi 101 wizyt
pytanie zadane 27 maja 2019 w C# przez poczatkujacy_pr Nowicjusz (180 p.)
0 głosów
1 odpowiedź 120 wizyt
pytanie zadane 6 listopada 2022 w Sprzęt komputerowy przez Telemele Nowicjusz (120 p.)
0 głosów
1 odpowiedź 167 wizyt
pytanie zadane 20 sierpnia 2017 w PHP przez sobi94 Początkujący (270 p.)

93,187 zapytań

142,203 odpowiedzi

322,021 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2301p. - CC PL
  5. 2269p. - Tomasz Bielak
  6. 2235p. - Łukasz Siedlecki
  7. 2232p. - rucin93
  8. 2169p. - Marcin Putra
  9. 2164p. - Adrian Wieprzkowicz
  10. 2006p. - Michal Drewniak
  11. 1950p. - Anonim 3619784
  12. 1909p. - Dawid128
  13. 1901p. - Mikbac
  14. 1744p. - rafalszastok
  15. 1487p. - Michał Telesz
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...