public IndexSearcher(Stream data, Stream index, Encoding encoding)
		{
			_data = data;
			_index = index;
			_encoding = encoding;

			_reader = new SourceReader(index, encoding, new []{0,1});
		}
		public void Sort()
		{
			var reader = new SourceReader(_csv, _options.Encoding, _columns);
			var readHeader = false;
			long lastFlushPosition = 0;
			foreach (var result in reader.ReadFromStream())
			{
				if (readHeader == false)
				{
					readHeader = true;
					continue;
				}

				for (int index = 0; index < result.Values.Count; index++)
				{
					var value = result.Values[index];
					var indexState = _indexes[index];
					var checkout = _pool.Checkout(value.Count);
					Array.Copy(value.Array, value.Offset, checkout, 0, value.Count);
					var arraySegment = new ArraySegment<char>(checkout, 0, value.Count);
					indexState.Values.Add(new IndexEntry
					{
						Position = result.Position,
						Value = arraySegment
					});
				}

				if ((_csv.Position - lastFlushPosition) > _options.FlushIndexesInternval)
				{
					lastFlushPosition = _csv.Position;
					FlushIntermediateIndexes();
					Console.Write("\r{0:#,#;;0} kb out of {1:#,#;;0} kb = {2:P2}", result.Position / 1024, _csv.Length / 1024, result.Position / (decimal)_csv.Length);
				}
			}
			FlushIntermediateIndexes();
			Console.WriteLine();

			MergePartialIndexes();
		}