/// <summary> /// Funkcja sortuje podaną w parametrze tablicę wystąpień i zapisuje ją do kolejnego pliku fragmentów /// /// Pliki posortowanych fragmentów znajdują się w katalogu tmpPostingsDirPath i mają nazwy zwracane /// przez funkcję tmpPostingsChunkFilePath. /// </summary> /// <param name="postings">Tablica nieposortowanych wystąpień</param> private void sortSaveTmpPostingsChunk(TmpPosting[] postings) { Console.WriteLine(postings.GetHashCode().ToString() + " sorting..."); Array.Sort<TmpPosting>(postings); Console.WriteLine(postings.GetHashCode().ToString() + " sorted, dumping..."); using (BinaryWriter writer = new BinaryWriter(File.Create(tmpPostingsChunkFilePath(nextSortedChunkFileNumber)))) { for (int i = 0, max = postings.Length; i < max; i++) postings[i].writeInto(writer); } Console.WriteLine(postings.GetHashCode().ToString() + " done"); nextSortedChunkFileNumber++; // Zwiększ numer następnego pliku }
/// <summary> /// Wczytuje następną porcję nieposortowanych wystąpień z pliku zbiorczego nieposortowanego /// /// Domyślnie wczytuje chunkSize wystąpień. Jeśli osiągnięto koniec pliku, zwraca tyle, ile zdołano odczytać. /// Jeśli nie odczytano czegokolwiek, zwraca null. /// </summary> /// <param name="source">Strumień odczytu BinaryReader z pliku zbiorczego</param> /// <returns>Tablica wystąpień albu NULL</returns> private TmpPosting[] readNextChunk(BinaryReader source) { /* Zainicjuj tablicę o rozmiarze chunkSize */ TmpPosting[] postings = new TmpPosting[chunkSize]; int postingsCount = 0; /* Wczytaj ile się da, maksymalnie chunkSize */ do { try { /* Spróbuj wczytać następne wystąpienie */ postings[postingsCount] = TmpPosting.readFrom(source); } catch (EndOfStreamException) { if (postingsCount != 0) { /* Wczytano mniej, ale wczytano cokolwiek, skoryguj rozmiar tablicy */ Array.Resize<TmpPosting>(ref postings, postingsCount); return postings; } /* Nie wczytano czegokolwiek, zwróć NULL */ return null; } } while (++postingsCount < chunkSize); // Licznik i sprawdź, żeby nie wczytać za dużo return postings; }