/// <summary> /// </summary> /// <param name="filename"> /// </param> /// <param name="version"> /// </param> /// <param name="dataList"> /// </param> /// <param name="packCount"> /// </param> /// <typeparam name="T"> /// </typeparam> /// <exception cref="Exception"> /// </exception> public static void CompressData <T>(string filename, string version, List <T> dataList, int packCount = 500) { // Need to build the serializer/deserializer prior to Task invocations MessagePackSerializer <List <T> > constructor = MessagePackSerializer.Create <List <T> >(); Console.WriteLine("Compressing " + typeof(T).Name + "s"); if (packCount == 0) { throw new Exception("Dont use 0 as packCount!!"); } using (Stream fileStream = new FileStream(filename, FileMode.Create)) { BinaryWriter binaryWriter = new BinaryWriter(fileStream); byte[] versionbuffer = Encoding.ASCII.GetBytes(version); binaryWriter.Write((byte)versionbuffer.Length); binaryWriter.Write(versionbuffer, 0, versionbuffer.Length); binaryWriter.Write(packCount); int tempCapacity = dataList.Count; binaryWriter.Write(tempCapacity); int maxCount = dataList.Count; // Write number of slices int slices = Convert.ToInt32(Math.Ceiling((double)maxCount / packCount)); binaryWriter.Write(slices); TaskedSerializer <T>[] taskData = new TaskedSerializer <T> [slices]; Task[] tasks = new Task[taskData.Length]; for (int i = 0; i < taskData.Count(); i++) { taskData[i] = new TaskedSerializer <T>(dataList.Skip(packCount * i).Take(packCount).ToList()); int i1 = i; tasks[i] = new Task(() => taskData[i1].Serialize()); tasks[i].Start(); } // Wait for all serialization to finish Task.WaitAll(tasks); Console.WriteLine("100% serialized"); // Write data streams foreach (TaskedSerializer <T> task in taskData) { task.Stream.Position = 0; int size = (int)task.Stream.Length; binaryWriter.Write(size); task.Stream.CopyTo(fileStream); task.Dispose(); } for (int i = 0; i < slices; i++) { taskData[i] = null; tasks[i].Dispose(); } } }