Jak mogę szybko utworzyć duże (> 1 GB) pliki tekstowe + binarne z „naturalną” treścią? (DO#)
Do celów testowania kompresji muszę mieć możliwość tworzenia dużych plików, najlepiej w formacie tekstowym, binarnym i mieszanym.
Zawartość plików nie powinna być ani całkowicie losowa, ani jednolita.Plik binarny ze wszystkimi zerami nie jest dobry. Plik binarny z całkowicie losowymi danymi również nie jest dobry. W przypadku tekstu plik z całkowicie losowymi sekwencjami ASCII nie jest dobry - pliki tekstowe powinny mieć wzorce i częstotliwości, które symulują język naturalny lub kod źródłowy (XML, C # itd.). Pseudo-prawdziwy tekst.Rozmiar każdego pojedynczego pliku nie jest krytyczny, ale dla zestawu plików potrzebna jest suma ~ 8 gb.Chciałbym zachować liczbę plików na rozsądnym poziomie, powiedzmy o (10).
Do tworzenia plików binarnych mogę utworzyć duży bufor i zrobić System.Random.NextBytes, a następnie FileStream.Write w pętli, tak jak poniżej:
<code>Int64 bytesRemaining = size; byte[] buffer = new byte[sz]; using (Stream fileStream = new FileStream(Filename, FileMode.Create, FileAccess.Write)) { while (bytesRemaining > 0) { int sizeOfChunkToWrite = (bytesRemaining > buffer.Length) ? buffer.Length : (int)bytesRemaining; if (!zeroes) _rnd.NextBytes(buffer); fileStream.Write(buffer, 0, sizeOfChunkToWrite); bytesRemaining -= sizeOfChunkToWrite; } fileStream.Close(); } </code>
Przy wystarczająco dużym buforze, powiedzmy 512k, jest to stosunkowo szybkie, nawet dla plików o rozmiarze ponad 2 lub 3 GB. Ale treść jest całkowicie przypadkowa, co nie jest tym, czego chcę.
W przypadku plików tekstowych zastosowałem podejścieLorem Ipsumi wielokrotnie emituj go przez StreamWriter do pliku tekstowego. Treść jest nielosowa i niejednolita, ale ma wiele identycznych powtarzających się bloków, co jest nienaturalne. Ponadto, ponieważ blok Lorem Ispum jest tak mały (<1k), wymaga wielu pętli i bardzo, bardzo długiego czasu.
Żadne z nich nie jest dla mnie zadowalające.
Widziałem odpowiedziSzybko utwórz duży plik w systemie Windows?. Te podejścia są bardzo szybkie, ale myślę, że po prostu wypełniają plik zerami lub przypadkowymi danymi, z których żadne nie jest tym, czego chcę. W razie potrzeby nie mam problemu z uruchomieniem zewnętrznego procesu, takiego jak contig lub fsutil.
Testy są uruchamiane w systemie Windows.
Czy zamiast tworzyć nowe pliki, bardziej sensowne jest używanie plików, które już istnieją w systemie plików? Nie znam żadnych, które są wystarczająco duże.
Co powiesz na rozpoczęcie od pojedynczego istniejącego pliku (może c: windows Microsoft .NET Framework 2.0.50727 Config companysec.config.cch dla pliku tekstowego) i wielokrotne kopiowanie jego zawartości? To działałoby z plikiem tekstowym lub binarnym.
Obecnie mam podejście tego rodzaju, ale uruchamianie zajmuje zbyt dużo czasu.
Czy ktoś inny to rozwiązał?
Czy istnieje dużo szybszy sposób zapisu pliku tekstowego niż za pomocą StreamWriter?
Propozycje?
EDYTOWAĆ: Podoba mi się pomysł łańcucha Markowa, aby wytworzyć bardziej naturalny tekst. Wciąż jednak musimy zmierzyć się z problemem prędkości.