protected void SaveData(SaveMetrics metrics) { Dictionary <CustomSerial, SaveData> data = World.Data; GenericWriter indexWriter; GenericWriter typeWriter; GenericWriter dataWriter; if (UseSequentialWriters) { indexWriter = new BinaryFileWriter(World.DataIndexPath, false); typeWriter = new BinaryFileWriter(World.DataTypesPath, false); dataWriter = new BinaryFileWriter(World.DataBinaryPath, true); } else { indexWriter = new AsyncWriter(World.DataIndexPath, false); typeWriter = new AsyncWriter(World.DataTypesPath, false); dataWriter = new AsyncWriter(World.DataBinaryPath, true); } indexWriter.Write(data.Count); foreach (SaveData saveData in data.Values) { long start = dataWriter.Position; indexWriter.Write(saveData._TypeID); indexWriter.Write(saveData.Serial); indexWriter.Write(start); saveData.Serialize(dataWriter); if (metrics != null) { metrics.OnDataSaved((int)(dataWriter.Position - start)); } indexWriter.Write((int)(dataWriter.Position - start)); } typeWriter.Write(World._DataTypes.Count); foreach (Type t in World._DataTypes) { typeWriter.Write(t.FullName); } indexWriter.Close(); typeWriter.Close(); dataWriter.Close(); }
private Task SaveData() { Task commitTask = StartCommitTask(_dataThreadWriters, _customData, _customIndex); IEnumerable <SaveData> data = World.Data.Values; Parallel.ForEach( data, () => new QueuedMemoryWriter(), (saveData, state, writer) => { long startPosition = writer.Position; saveData.Serialize(writer); var size = (int)(writer.Position - startPosition); writer.QueueForIndex(saveData, size); if (_metrics != null) { _metrics.OnDataSaved(size); } return(writer); }, writer => { writer.Flush(); _dataThreadWriters.Add(writer); }); _dataThreadWriters.CompleteAdding(); return(commitTask); }
protected void SaveData(SaveMetrics metrics) { Dictionary<CustomSerial, SaveData> data = World.Data; GenericWriter indexWriter; GenericWriter typeWriter; GenericWriter dataWriter; if (this.UseSequentialWriters) { indexWriter = new BinaryFileWriter(World.DataIndexPath, false); typeWriter = new BinaryFileWriter(World.DataTypesPath, false); dataWriter = new BinaryFileWriter(World.DataBinaryPath, true); } else { indexWriter = new AsyncWriter(World.DataIndexPath, false); typeWriter = new AsyncWriter(World.DataTypesPath, false); dataWriter = new AsyncWriter(World.DataBinaryPath, true); } indexWriter.Write(data.Count); foreach (SaveData saveData in data.Values) { long start = dataWriter.Position; indexWriter.Write(saveData._TypeID); indexWriter.Write((int)saveData.Serial); indexWriter.Write(start); saveData.Serialize(dataWriter); if (metrics != null) metrics.OnDataSaved((int)(dataWriter.Position - start)); indexWriter.Write((int)(dataWriter.Position - start)); } typeWriter.Write(World._DataTypes.Count); for (int i = 0; i < World._DataTypes.Count; ++i) typeWriter.Write(World._DataTypes[i].FullName); indexWriter.Close(); typeWriter.Close(); dataWriter.Close(); }