Exemple #1
0
        /// <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();
                }
            }
        }