Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
babanty
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 44
#1

Какой лучший способ хранения большого объема данных?

17.09.2015, 00:29. Просмотров 951. Ответов 17
Метки нет (Все метки)

Доброй ночи
Требуется простой совет, каким образом лучше всего хранить большой объем данных?
Приложение генерирует большой объем данных (как правило типа int и bool), и с ним работает. Объем записываемых данных в секунду большой, не важно сколько это будет весить, важно что бы записывал данные быстро.
Желательно еще скинуть литературу (или ссылки на хорошие статьи) как работать с этой записью на С#
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2015, 00:29
Ответы с готовыми решениями:

Сереализация, бинарный формат, или лучший способ хранения информация
Много читал по поводу бинарных файлов, систем счисления, способов хранения...

Оптимизация хранения большого количества объектов в Dictionary
Добрый день. Имеется некий класс Quest и список public static...

Способ хранения информации необходимой для работы программы
Доброго времени суток. На данный момент информация, нужная для работы...

Какой по вашему мнению лучший обфускатор для C#
Какой по вашему мнению лучший обфускатор для C#? Каким пользуетесь вы?

Какой способ выбрать для создания GUI?
Здравствуйте. Необходимо создать проект с графическим интерфейсом. После поиска...

17
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
17.09.2015, 16:44 #2
о чем идет речь, нужна БД, которая будет хранить данные на жестком диске или вопрос как это хранить лучше в оперативной памяти?
0
babanty
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 44
17.09.2015, 20:23  [ТС] #3
VLK, Хранение на жестком диске
0
lodret
Заблокирован
17.09.2015, 20:28 #4
Цитата Сообщение от babanty Посмотреть сообщение
Хранение на жестком диске
согласен на все 100%
0
babanty
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 44
17.09.2015, 20:50  [ТС] #5
Я возможно не правильно выразился...
Как сделать бд что бы инфа типа int и bool в нее максимально быстро записывалась, может быть в xml или с помощью sql?
0
Storm23
Эксперт .NETАвтор FAQ
6108 / 3664 / 1387
Регистрация: 11.01.2015
Сообщений: 4,823
Записей в блоге: 31
17.09.2015, 20:54 #6
Лучший ответ Сообщение было отмечено babanty как решение

Решение

babanty, максимально быстро - прямая запись в файл через BinaryWriter. Быстрее прямой записи в файл ничего нет.
Если данные приходят неравномерно - можно сделать очередь и отдельный поток для разгрузки очереди в файл.
1
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
17.09.2015, 21:34 #7
что за данные, для чего они нужны, как в дальнейшем будут использоваться.

если они активно будут использоваться (поиски и т.д.) тогда запускай сервер MySQL или MS SQL, если это мертвый груз, ну тогда записывай в файлы, именно в файлы, а схему как разбивать по частям уже сам придумай, допустим каждый час создается новый файл и в него записывается или веди учет сколько в файл записано данных, допустим записал 100 000 строк, создаешь новый, как то так.
1
babanty
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 44
18.09.2015, 11:24  [ТС] #8
Storm23, Спасибо, думаю это то что нужно
0
Casper-SC
Эксперт .NET
3616 / 1825 / 355
Регистрация: 27.03.2010
Сообщений: 5,134
Записей в блоге: 1
18.09.2015, 15:56 #9
Цитата Сообщение от VLK Посмотреть сообщение
допустим записал 100 000 строк, создаешь новый, как то так
Можно в начале файла сохранять кол-во элементов этом файле. Далее писать размер текущей записи (чтобы знать насколько нужно смещаться, чтобы прочесть следующую запись, сама запись (байты). То есть можно записать так, чтобы можно было легко найти запись в файле по её индексу/номеру, а не читать целиком все данные из этого файла.

Например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
 
namespace DataToBinary
{
    public class Data
    {
        public Data()
            : this(-1, String.Empty)
        {
        }
 
        public Data(int id, string text)
        {
            Id = id;
            Text = text;
        }
 
        public int Id { get; set; }
 
        public string Text { get; set; }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.IO;
using System.Text;
 
namespace DataToBinary
{
    class Program
    {
        static void Main(string[] args)
        {
            Data[] datas =
            {
                new Data(1, "Text 1"), 
                new Data(2, "Текст 2"), 
                new Data(3, "Text 3"), 
                new Data(4, "Text 4"), 
                new Data(5, "Текст 5"), 
            };
            string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Data.dat");
 
            Console.WriteLine("Сохраняем данные...");
            Save(datas, fileName);
 
            Console.WriteLine("Читаем данные...");
            Data[] loaded = Load(fileName);
 
            Console.WriteLine("Выводим на экран:");
            DisplayData(loaded);
 
            Console.ReadKey();
        }
 
        static void DisplayData(Data[] datas)
        {
            foreach (Data data in datas)
            {
                Console.WriteLine("Id: {0}; Text : {1}", data.Id, data.Text);
            }
        }
 
        static void Save(Data[] datas, string fileName)
        {
            FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);
            using (var writer = new BinaryWriter(fs, Encoding.UTF8))
            {
                writer.Write(datas.Length);  //Int32
                foreach (Data data in datas)
                {
                    byte[] idBytes = BitConverter.GetBytes(data.Id);
                    byte[] textBytes = GetBytes(data.Text);
                    int recordLength = idBytes.Length + textBytes.Length;
                    writer.Write(recordLength); //Размер записи
                    writer.Write(idBytes); //Id
                    writer.Write(textBytes.Length); //Размер записи текста
                    writer.Write(textBytes); //Text
                }
            }
        }
 
        static Data[] Load(string fileName)
        {
            Data[] datas = null;
            FileStream fs = new FileStream(fileName, FileMode.Open);
            using (var reader = new BinaryReader(fs, Encoding.UTF8))
            {
                int arraySize = reader.ReadInt32();  //Int32
                datas = new Data[arraySize];
 
                for (int i = 0; i < arraySize; i++)
                {
                    int recordSize = reader.ReadInt32();
                    int id = reader.ReadInt32();
                    int sizeOfText = reader.ReadInt32();
                    string text = GetString(reader.ReadBytes(sizeOfText));
 
                    datas[i] = new Data(id, text);
                }
            }
 
            return datas;
        }
 
        static byte[] GetBytes(string text)
        {
            byte[] bytes = new byte[text.Length * sizeof(char)];
            System.Buffer.BlockCopy(text.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }
 
        static string GetString(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / sizeof(char)];
            System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
            return new string(chars);
        }
    }
}
1
Вложения
Тип файла: rar DataToBinary.rar (8.6 Кб, 3 просмотров)
Casper-SC
Эксперт .NET
3616 / 1825 / 355
Регистрация: 27.03.2010
Сообщений: 5,134
Записей в блоге: 1
18.09.2015, 15:58 #10
А вообще, можно даже в начале писать все смещения для всех индексов, чтобы по всему файлу не прыгать в поиске нужной записи, а сразу прочесть её смещение.

Добавлено через 26 секунд
Ну и да, делить файлы, если они становятся слишком большими тоже вполне себе здравая идея.
0
Psilon
Master of Orion
Эксперт .NET
5993 / 4846 / 901
Регистрация: 10.07.2011
Сообщений: 14,459
Записей в блоге: 5
Завершенные тесты: 4
19.09.2015, 00:21 #11
Storm23, разве БД не быстрее? Она там и в памяти может записывать, и всё прочее. Если много нужно записывать, то БД лучший вариант.
0
Storm23
Эксперт .NETАвтор FAQ
6108 / 3664 / 1387
Регистрация: 11.01.2015
Сообщений: 4,823
Записей в блоге: 31
19.09.2015, 07:38 #12
Цитата Сообщение от Psilon Посмотреть сообщение
разве БД не быстрее?
С чего бы это? Давайте посмотрим:
1) Сколько бы БД в память не записывала - ей все равно придется это скидывать на диск. Какова скорость скидывания на диск? Точно такая же как у FileStream.
2) "Записывать в память" и вот это все. Нам никто не мешает тоже делать буферизацию. Более того, FileStream уже содержит буфер (по умолчанию 4кб, можно менять). Да и современные ОС буферизируют файлы на уровне ядра. Кроме того, максимальная скорость потока данных не зависит от буферизации. Буфер полезен только тогда, когда поток данных - неравномерный. Тогда, пока данные не поступают, можно потихоньку писать на диск. Снова же - никто нам не мешает это сделать самим, без БД.

Это все было о том, почему у БД нет преимуществ. Теперь о том, почему БД хуже:

3) Жуткий оверхед. Для того, что бы отправить один байт в БД, нужно: преобразовать байт в строку, создать SQL команду, отправить на севрер через TCP/IP, серверу нужно распрасить строку запроса, выполнить запрос и сохранить данные.
4) А ведь еще есть: логирование (MS SQL ведет лог всех операций, в текстовом виде!), а еще есть поддержка транзакций и возможностей отката. А еще есть оверхед на хранение структуры таблицы, индексы. И т.д.

И вы думаете это все будет работать быстрее, чем просто скинуть байт в файл?
Конечно MSSQL это монстр, но даже если взять SQLite, все равно будет все тоже самое, только в меньших масштабах.
Цитата Сообщение от Psilon Посмотреть сообщение
Если много нужно записывать, то БД лучший вариант.
А вопрос не стоял "много", вопрос стоял "быстро". А кроме того, Psilon, вы наверно дома видеофайлы на 4гб храните побайтно в БД?

Конклюжен: БД это хорошо, когда у вас есть реляционный набор данных, и вам нужна инфраструктура по их хранению. Если вам нужно быстро и эффективно сохранять бинарные данные - стандартные БД неэффективны.
1
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
19.09.2015, 14:06 #13
ну надо еще узнать что за данные, как они потом будут использоваться, сколько они хранится будут и т.д.
0
Konctantin
939 / 743 / 170
Регистрация: 12.04.2009
Сообщений: 1,700
19.09.2015, 15:02 #14
вы наверно дома видеофайлы на 4гб храните побайтно в БД?
автор сказал про данные (bool, int, ect) и если они таковы, то писать их надо для чего-то, а не просто так.
складывать чтобы они висели мертвым грузом можно, но как потом с ними работать?

С БД дела обстоят намного лучше, тот же sqllite к примеру.
Либо придумать такой формат файла, который бы давал возможность максимально доступно обращаться к данным.

Вообще то вы развели демагогию, а автор так толком и не объяснил - нафига ему это надо.
0
m0nax
1203 / 908 / 109
Регистрация: 12.01.2010
Сообщений: 1,891
Завершенные тесты: 3
19.09.2015, 16:40 #15
если бы автор еще уточнил что такое "большой объем" было бы проще
в обычном dictionary можно хранить миллионы записей с мгновенным доступом и записью в файл обычным binaryfromatter

Добавлено через 51 секунду
ну да память скушает, аж несколько мегабайт..
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
19.09.2015, 18:28 #16
Цитата Сообщение от m0nax Посмотреть сообщение
с мгновенным доступом и записью в файл обычным binaryfromatter
можно небольшой примерчик.
0
babanty
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 44
19.09.2015, 23:43  [ТС] #17
Всем спасибо за ответы и рассуждения
Наверное это не стоило таких глубоких Ваших рассуждений, но в обще я делаю клеточный автомат типа "жизнь". Хочу сохранить историю "деятельности клеток" и ее интересные моменты при необходимости загружать
0
dondublon
2136 / 1054 / 212
Регистрация: 17.03.2012
Сообщений: 6,389
Записей в блоге: 5
21.09.2015, 11:58 #18
Быстрее прямой записи на диск, как тут верно заметили, ничего быть не может.
А вот если нужны "удобства" - тут уже можно искать и выбирать.
Про xml, очевидно, можно забыть сразу. SQL, во всех вариантах - только если использовать BLOB-ы. Правда, тогда теряется и смысл SQL.
Для хранения массивов бинарных данных хорош формат HDF5.
0
21.09.2015, 11:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2015, 11:58

Есть какой нибудь способ отобразить логические символы?
в текстовом поле c#? то есть их настоящий вид? к примеру отрицание...

Существует ли хоть какой-нибудь способ получить в коде версию Visual Studio?
Эксперты, вся надежда на вас. Существует ли хоть какая-нибудь возможность В...

Возврат большого количества данных функцией
Доброго времени суток. Вопрос такой: есть функция, которая генерирует 120...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru