static void ReadAggIndexTest(ChunkManager chunkManager, int singleFileIndexCount, int dataUnitSize, int indexCountForSingleAgg) { var queryCount = 1000; var parallelLevel = 4; chunkManager.Load(x => { var index = new StreamIndex(); index.ReadFrom(x); return(index); }); var waitHandle = new ManualResetEvent(false); var totalExpectCount = parallelLevel * queryCount * indexCountForSingleAgg; var totalFoundCount = 0; var watch = Stopwatch.StartNew(); for (var i = 0; i < parallelLevel; i++) { Task.Factory.StartNew(() => { var baseAggNumber = new Random().Next(98000); var foundCount = ReadIndex(chunkManager, dataUnitSize, singleFileIndexCount, indexCountForSingleAgg, baseAggNumber, queryCount); var currentCount = Interlocked.Add(ref totalFoundCount, foundCount); if (currentCount == totalExpectCount) { waitHandle.Set(); } }); } waitHandle.WaitOne(); Console.WriteLine("Read single chunk success, parallelLevel: {0}, aggCount: {1}, timeSpent: {2}ms", parallelLevel, totalFoundCount / indexCountForSingleAgg, watch.ElapsedMilliseconds); }
static int ReadIndex(ChunkManager chunkManager, int dataUnitSize, int singleFileIndexCount, int eventIndexOfEachAgg, int baseAggNumber, int queryCount) { var format = "{0}{1:00000000000000}"; var aggPrefix = "aggregate_"; var foundCount = 0; for (var aggNumber = baseAggNumber; aggNumber < (baseAggNumber + queryCount); aggNumber++) { var position = aggNumber * eventIndexOfEachAgg * dataUnitSize; var chunk = chunkManager.GetChunkFor(position); var expectSourceId = string.Format(format, aggPrefix, aggNumber); var indexList = new List <StreamIndex>(); var start = chunk.ChunkHeader.GetLocalDataPosition(position); for (var i = start; i < singleFileIndexCount * dataUnitSize; i += dataUnitSize) { try { var streamIndex = chunk.TryReadAt(i, x => { var index = new StreamIndex(); index.ReadFrom(x); return(index); }, false); if (streamIndex.SourceId == expectSourceId) { indexList.Add(streamIndex); } else if (indexList.Count > 0) { break; } } catch (Exception ex) { Console.WriteLine(string.Format("i: {0}, ex: {1}", i, ex)); break; } } foundCount += indexList.Count; } return(foundCount); }
static void CreateChunks(string root, string path, ChunkManager chunkManager, int singleFileIndexCount, int dataUnitSize, int totalAggNumber, int indexCountForSingleAgg) { if (Directory.Exists(root)) { Directory.Delete(root, true); } Directory.CreateDirectory(root); if (Directory.Exists(path)) { Directory.Delete(path, true); } Directory.CreateDirectory(path); var chunkWriter = new ChunkWriter(chunkManager); chunkWriter.Open(); var watch = Stopwatch.StartNew(); var format = "{0}{1:00000000000000}"; var aggPrefix = "aggregate_"; for (var i = 0; i < totalAggNumber; i++) { var sourceId = string.Format(format, aggPrefix, i); for (var j = 0; j < indexCountForSingleAgg; j++) { var record = new StreamIndex() { SourceId = sourceId, CommandId = ObjectId.GenerateNewStringId(), Version = j + 1, BodyPosition = 10000L }; chunkWriter.Write(record); } } chunkWriter.Close(); Console.WriteLine("Create event index success, aggCount: {0}, totalEventIndexCount: {1}, timeSpent: {2}ms", totalAggNumber, totalAggNumber * indexCountForSingleAgg, watch.ElapsedMilliseconds); }
public override string ToString() { var filterParameters = new StringBuilder(100); if (Resource != null) { FilterUtility.ConcatenateParameter(filterParameters, "filename", Resource.Path); } if (!string.IsNullOrWhiteSpace(FormatName)) { FilterUtility.ConcatenateParameter(filterParameters, "f", FormatName); } if (SeekPoint.HasValue) { FilterUtility.ConcatenateParameter(filterParameters, "sp", SeekPoint.GetValueOrDefault()); } if (!string.IsNullOrWhiteSpace(Streams)) { FilterUtility.ConcatenateParameter(filterParameters, "s", Streams); } if (StreamIndex.HasValue) { FilterUtility.ConcatenateParameter(filterParameters, "si", StreamIndex.GetValueOrDefault()); } if (Loop.HasValue) { FilterUtility.ConcatenateParameter(filterParameters, "loop", Loop.GetValueOrDefault()); } return(FilterUtility.JoinTypeAndParameters(this, filterParameters)); }
/// <inheritdoc /> public override int GetHashCode() => PresentationTime.GetHashCode() ^ StreamIndex.GetHashCode();