Ejemplo n.º 1
0
            /// <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
            }
Ejemplo n.º 2
0
            /// <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;
            }