Дисковое хранилище массивов и т. д.
У кого-нибудь есть опыт хранения данных на диске? У меня есть приложение для моделирования в памяти, которое может выполнять вычисления и т. Д. В основном данные хранятся в виде списков объектов, которые имеют вложенные коллекции значений ключей, такие как Dictionary
Прямо сейчас я использую SQL-Server как постоянный слой, но я использую его очень мало. Так что я думаю, что могу записать / прочитать данные на диск самостоятельно, чтобы уменьшить зависимости и упростить установку.
Поэтому я написал небольшую подпрограмму, которая записывает каждый массив на диск примерно в таком формате, где слова "ObjId", "Type", "Valid" и "Count" на самом деле не находятся в файле, они 1-й, 2-й, 3-й и 4-й int в байте [], затем идут пары
Bytes: 52
ObjId: 123
Valid: 234
Type: double
Count: 3
1 .23
2 .34
3 .45
В реальной жизни нет отступов и т. Д., Они все последовательные байты в длинном потоке.
Это хорошо, чтобы написать один раз. Но когда я хочу написать дополнительное значение где-то посередине, я должен переписать все это. Также я не могу легко обновить одно значение.
Один из вариантов - записать каждый объект в отдельный файл, поэтому мне нужно будет только переписать его. Но это кажется довольно неэффективным, потому что я получаю файлы размером 1 КБ, но 4 КБ на диске, поэтому я бы тратил на них место.
Итак, что мне нужно сделать, чтобы иметь возможность постепенно записывать этот файл на диск? Я знаю, что у SqlServer есть "страницы", куда он записывает данные, это путь?
Есть ли какая-нибудь библиотека, готовая для решения этой проблемы? Может быть, какой-нибудь виртуальный файл, который позволит мне обрабатывать их как отдельный байт [], но обрабатывать хранилище как один физический файл? Идеально сжатый.. (толкает его, но кто знает.. Я был удивлен раньше:-)
Заранее спасибо,
Герт-Ян
4 ответа
Если вам не нужны служебные данные СУБД, вы можете использовать базу данных значений ключей, такую как Berkeley DB. Здесь есть интерфейс C#:
Вы можете иметь одну запись для каждого массива, и просто переписать это, когда вам нужно. Остальная часть файла базы данных останется неизменной, так что это гораздо быстрее, чем переписать весь файл.
Вы можете повторно использовать логику сериализации, которую вы уже реализовали, когда записываете массив. Все, что вам нужно добавить, это уникальный ключ для каждого массива.
Существует тысяча и один способ хранения информации на диске. У вас уже были предложения о базах данных. Вы также можете рассмотреть структурированные форматы файлов, такие как HDF5, который имеет привязки для языков, включая C#. Одной из сильных сторон HDF5 является поддержка хранения n-мерных массивов.
Вы не сможете обойтись, имея по 1 файлу на объект или переписав весь список объектов при внесении изменений. Вы можете использовать SQLite. Это встроенная в один файл база данных, которая очень быстрая и эффективная. Это означает, что ваше приложение не имеет внешних зависимостей от БД.
Если вы пишете свои данные напрямую, вы должны прочитать и записать их в двоичном формате. Вы будете хранить ваши целые числа в одном байте вместо их представления ASCII (1234 = 4 байта, но это 1-байтовое целое число).
Это ускорит чтение и запись в файл.
Некоторый код из статьи:
Hashtable addresses = new Hashtable();
addresses.Add("Jeff", "123 Main Street, Redmond, WA 98052");
addresses.Add("Fred", "987 Pine Road, Phila., PA 19116");
addresses.Add("Mary", "PO Box 112233, Palo Alto, CA 94301");
// To serialize the hashtable and its key/value pairs,
// you must first open a stream for writing.
// In this case, use a file stream.
FileStream fs = new FileStream("DataFile.dat", FileMode.Create);
// Construct a BinaryFormatter and use it to serialize the data to the stream.
BinaryFormatter formatter = new BinaryFormatter();
try
{
formatter.Serialize(fs, addresses);
}
catch (SerializationException e)
{
Console.WriteLine("Failed to serialize. Reason: " + e.Message);
throw;
}
В дополнение к другим предложениям, сделанным здесь, вы можете попробовать MongoDB с NORM как отличный, не требующий трения (нет базы данных для настройки, нет объектного реляционного сопоставления для создания) способ хранения данных без накладных расходов / затрат на SQL-сервер.