Я хочу сохранить массив временных меток в двоичном плоском файле. Одно из моих требований заключается в том, что позже я могу получить доступ к отдельным временным меткам для целей эффективного запроса без необходимости сначала читать и десериализовать весь массив (я использую алгоритм двоичного поиска, который находит позицию в файле начальной временной метки и конечная временная метка, которая, в свою очередь, определяет, какие байты считываются и десериализуются между этими двумя временными метками, поскольку весь двоичный файл может иметь размер в несколько гигабайт).
Очевидно, что простой, но медленный способ заключается в использовании BitConverter.GetBytes(timestamp)
для преобразовать каждую метку времени в байты и затем сохранить их в файле. Затем я могу получить доступ к каждому элементу по отдельности в файле и использовать свой собственный алгоритм двоичного поиска, чтобы найти метку времени, которая соответствует желаемой метке времени.
Однако я обнаружил, что BinaryFormatter невероятно эффективен (в несколько раз быстрее, чем protobuf- net и любой другой сериализатор, который я пробовал) в отношении сериализации / десериализации массивов типов значений. Поэтому я попытался сериализовать массив временных меток в двоичную форму. Однако, по-видимому, теперь это не позволит мне получить доступ к отдельным временным меткам в файле без предварительной десериализации всего массива.
Есть ли способ получить доступ к отдельным элементам в двоичном виде после сериализации всего массива элементов через BinaryFormatter?
Вот фрагмент кода, демонстрирующий, что я имею в виду:
var sampleArray = new int[5] { 1,2,3,4,5};
var serializedSingleValueArray = sampleArray.SelectMany(x => BitConverter.GetBytes(x)).ToArray();
var serializedArrayofSingleValues = Serializers.BinarySerializeToArray(sampleArray);
var deserializesToCorrectValue = BitConverter.ToInt32(serializedSingleValueArray, 0); //value = 1 (ok)
var wrongDeserialization = BitConverter.ToInt32(serializedArrayofSingleValues, 0); //value = 256 (???)
Здесь функция сериализации:
public static byte[]BinarySerializeToArray(object toSerialize)
{
using (var stream = new MemoryStream())
{
Formatter.Serialize(stream, toSerialize);
return stream.ToArray();
}
}
Редактировать: мне не нужно заботиться об эффективном потреблении памяти или размерах файлов, поскольку в настоящее время они не являются узкими местами. Именно скорость сериализации и десериализации является для меня узким местом с большими гигабайтовыми большими двоичными файлами и, следовательно, с очень большими массивами примитивов.