private static void Generate(string tempFile, SerializationEngine serializer, List<TestClass> list, Action<Action<int>> loop) { using (var stream = new FileStream(tempFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile<TestClass>(lFile, serializer); // append COUNT records ShowTime("append", () => loop(i => file.Append(list[i]))); // read all the records ShowTime("read all", () => { var records = file.ReadFrom(0).ToList(); }); // read all the records, one at a time ShowTime("read all, one at a time", () => loop(i => file.Read(i))); } // close and reopen the file (rebuilds the index) ShowTime("rebuild index", () => { using (var stream = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); } }); }
private static void Verify2(string tempFile, SerializationEngine serializer, IReadOnlyList <TestClass> list) { using (var data = new FileAccessor(tempFile)) { var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile <TestClass>(lFile, serializer); var records = file.ReadFrom(0).ToList(); // fails even when sorting the lists //list = list.OrderBy(it => it.Name).ToList(); //records = records.OrderBy(it => it.Name).ToList(); // verify that the index is built correctly for (var i = 0; i < COUNT; i++) { var r = records[i]; if (r.Name != list[i].Name) { throw new Exception($"Verify2: Expected [{list[i].Name}] but was [{r.Name}]."); } if (r.Address != list[i].Address) { throw new Exception($"Verify2: Expected [{list[i].Address}] but was [{r.Address}]."); } } } }
public void GenericAppendOnlyFileSmokeTest() { var stream = new MemoryStream(); var data = new StreamAccessor(stream); var file = new LowLevelAppendOnlyFile(data); var serializer = new ProtoBufSerializationEngine(); var sut = new GenericAppendOnlyFile <TestClass>(file, serializer); sut.Append(new TestClass { Name = "Marcel", Address = "Kennesaw, GA" }); sut.Append(new TestClass { Name = "Gigi Meseriasu", Address = "Washington, DC" }); var r1 = sut.Read(0); Assert.AreEqual("Marcel", r1.Name); Assert.AreEqual("Kennesaw, GA", r1.Address); var rs = sut.ReadFrom(0).ToList(); var r2 = rs[1]; Assert.AreEqual("Gigi Meseriasu", r2.Name); Assert.AreEqual("Washington, DC", r2.Address); Assert.AreEqual(2, sut.Index.Length); Assert.AreEqual(0, sut.Index[0]); }
private static void Verify1(string tempFile, SerializationEngine serializer, IReadOnlyList <TestClass> list) { using (var stream = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile <TestClass>(lFile, serializer); var records = file.ReadFrom(0).ToList(); // fails without sorting the lists, so the ordering is somehow incorrect //list = list.OrderBy(it => it.Name).ToList(); //records = records.OrderBy(it => it.Name).ToList(); // verify that the index is built correctly for (var i = 0; i < COUNT; i++) { var r = records[i]; if (r.Name != list[i].Name) { throw new Exception($"Verify1: Expected [{list[i].Name}] but was [{r.Name}]."); } if (r.Address != list[i].Address) { throw new Exception($"Verify1: Expected [{list[i].Address}] but was [{r.Address}]."); } } } }
private static void Generate(string tempFile, SerializationEngine serializer, List <TestClass> list, Action <Action <int> > loop) { using (var stream = new FileStream(tempFile, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile <TestClass>(lFile, serializer); // append COUNT records ShowTime("append", () => loop(i => file.Append(list[i]))); // read all the records ShowTime("read all", () => { var records = file.ReadFrom(0).ToList(); }); // read all the records, one at a time ShowTime("read all, one at a time", () => loop(i => file.Read(i))); } // close and reopen the file (rebuilds the index) ShowTime("rebuild index", () => { using (var stream = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); } }); }
private static void CreateAndProcessFile(RandomAccessor data, SerializationEngine serializer, IReadOnlyList <TestClass> list, Action <Action <int> > loop) { var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile <TestClass>(lFile, serializer); // append COUNT records ShowTimeIncludingOpsPerSec("append", () => loop(i => file.Append(list[i]))); // read all the records in a single batch ShowTimeIncludingOpsPerSec("read all in a single batch", () => { var records = file.ReadFrom(0).ToList(); }); // read all the records, individually ShowTimeIncludingOpsPerSec("read all, individually", () => loop(i => file.Read(i))); }
private static void Main(string[] args) { var serializer = new ProtoBufSerializationEngine(); var list = new List <TestClass>(); for (var i = 0; i < COUNT; i++) { var c = new TestClass { Name = GenerateRandomString(20), Address = GenerateRandomString(40) }; list.Add(c); } var tempFile = Path.GetTempFileName(); Console.WriteLine("Using {0} - sequentially writing and reading {1} records", tempFile, COUNT); Generate(tempFile, serializer, list, SeqForLoop); // verify the data using (var stream = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile <TestClass>(lFile, serializer); var records = file.ReadFrom(0).ToList(); // verify that the index is built correctly for (var i = 0; i < COUNT; i++) { var r = records[i]; Debug.Assert(r.Name == list[i].Name); Debug.Assert(r.Address == list[i].Address); } } // multi-threaded test tempFile = Path.GetTempFileName(); Console.WriteLine("Using {0} - multi-threaded writing and reading {1} records", tempFile, COUNT); Generate(tempFile, serializer, list, ParForLoop); }
public void GenericAppendOnlyFileSmokeTest() { var stream = new MemoryStream(); var data = new StreamAccessor(stream); var file = new LowLevelAppendOnlyFile(data); var serializer = new ProtoBufSerializationEngine(); var sut = new GenericAppendOnlyFile<TestClass>(file, serializer); sut.Append(new TestClass {Name = "Marcel", Address = "Kennesaw, GA"}); sut.Append(new TestClass {Name = "Gigi Meseriasu", Address = "Washington, DC"}); var r1 = sut.Read(0); Assert.AreEqual("Marcel", r1.Name); Assert.AreEqual("Kennesaw, GA", r1.Address); var rs = sut.ReadFrom(0).ToList(); var r2 = rs[1]; Assert.AreEqual("Gigi Meseriasu", r2.Name); Assert.AreEqual("Washington, DC", r2.Address); Assert.AreEqual(2, sut.Index.Length); Assert.AreEqual(0, sut.Index[0]); }
private static void Main(string[] args) { var serializer = new ProtoBufSerializationEngine(); var list = new List<TestClass>(); for (var i = 0; i < COUNT; i++) { var c = new TestClass {Name = GenerateRandomString(20), Address = GenerateRandomString(40)}; list.Add(c); } var tempFile = Path.GetTempFileName(); Console.WriteLine("Using {0} - sequentially writing and reading {1} records", tempFile, COUNT); Generate(tempFile, serializer, list, SeqForLoop); // verify the data using (var stream = new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { var data = new StreamAccessor(stream); var lFile = new LowLevelAppendOnlyFile(data); var file = new GenericAppendOnlyFile<TestClass>(lFile, serializer); var records = file.ReadFrom(0).ToList(); // verify that the index is built correctly for (var i = 0; i < COUNT; i++) { var r = records[i]; Debug.Assert(r.Name == list[i].Name); Debug.Assert(r.Address == list[i].Address); } } // multi-threaded test tempFile = Path.GetTempFileName(); Console.WriteLine("Using {0} - multi-threaded writing and reading {1} records", tempFile, COUNT); Generate(tempFile, serializer, list, ParForLoop); }