Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
 
babanty
1 / 1 / 0
Регистрация: 13.08.2015
Сообщений: 44
#1

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

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

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

Сереализация, бинарный формат, или лучший способ хранения информация - C#
Много читал по поводу бинарных файлов, систем счисления, способов хранения информация и ничего не понял :D Допустим есть класс, мне...

Оптимизация хранения большого количества объектов в Dictionary - C#
Добрый день. Имеется некий класс Quest и список public static Dictionary<Subject, Dictionary<byte, List<Quest>>> newdata_quest = new...

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

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

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

Существует ли хоть какой-нибудь способ получить в коде версию Visual Studio? - C#
Эксперты, вся надежда на вас. Существует ли хоть какая-нибудь возможность В КОДЕ получить версию visual studio, в которой этот код был...

17
VLK
195 / 164 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
17.09.2015, 16:44 #2
о чем идет речь, нужна БД, которая будет хранить данные на жестком диске или вопрос как это хранить лучше в оперативной памяти?
0
babanty
1 / 1 / 0
Регистрация: 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 / 0
Регистрация: 13.08.2015
Сообщений: 44
17.09.2015, 20:50  [ТС] #5
Я возможно не правильно выразился...
Как сделать бд что бы инфа типа int и bool в нее максимально быстро записывалась, может быть в xml или с помощью sql?
0
Storm23
Эксперт .NETАвтор FAQ
5727 / 3462 / 1056
Регистрация: 11.01.2015
Сообщений: 4,587
Записей в блоге: 31
17.09.2015, 20:54 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
babanty, максимально быстро - прямая запись в файл через BinaryWriter. Быстрее прямой записи в файл ничего нет.
Если данные приходят неравномерно - можно сделать очередь и отдельный поток для разгрузки очереди в файл.
1
VLK
195 / 164 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
17.09.2015, 21:34 #7
что за данные, для чего они нужны, как в дальнейшем будут использоваться.

если они активно будут использоваться (поиски и т.д.) тогда запускай сервер MySQL или MS SQL, если это мертвый груз, ну тогда записывай в файлы, именно в файлы, а схему как разбивать по частям уже сам придумай, допустим каждый час создается новый файл и в него записывается или веди учет сколько в файл записано данных, допустим записал 100 000 строк, создаешь новый, как то так.
1
babanty
1 / 1 / 0
Регистрация: 13.08.2015
Сообщений: 44
18.09.2015, 11:24  [ТС] #8
Storm23, Спасибо, думаю это то что нужно
0
Casper-SC
Эксперт .NET
3572 / 1792 / 201
Регистрация: 27.03.2010
Сообщений: 5,043
Записей в блоге: 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
3572 / 1792 / 201
Регистрация: 27.03.2010
Сообщений: 5,043
Записей в блоге: 1
18.09.2015, 15:58 #10
А вообще, можно даже в начале писать все смещения для всех индексов, чтобы по всему файлу не прыгать в поиске нужной записи, а сразу прочесть её смещение.

Добавлено через 26 секунд
Ну и да, делить файлы, если они становятся слишком большими тоже вполне себе здравая идея.
0
Psilon
Master of Orion
Эксперт .NET
5935 / 4834 / 636
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
19.09.2015, 00:21 #11
Storm23, разве БД не быстрее? Она там и в памяти может записывать, и всё прочее. Если много нужно записывать, то БД лучший вариант.
0
Storm23
Эксперт .NETАвтор FAQ
5727 / 3462 / 1056
Регистрация: 11.01.2015
Сообщений: 4,587
Записей в блоге: 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 / 12
Регистрация: 05.05.2013
Сообщений: 1,197
19.09.2015, 14:06 #13
ну надо еще узнать что за данные, как они потом будут использоваться, сколько они хранится будут и т.д.
0
Konctantin
937 / 741 / 64
Регистрация: 12.04.2009
Сообщений: 1,700
19.09.2015, 15:02 #14
вы наверно дома видеофайлы на 4гб храните побайтно в БД?
автор сказал про данные (bool, int, ect) и если они таковы, то писать их надо для чего-то, а не просто так.
складывать чтобы они висели мертвым грузом можно, но как потом с ними работать?

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

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

Добавлено через 51 секунду
ну да память скушает, аж несколько мегабайт..
0
19.09.2015, 16:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 16:40
Привет! Вот еще темы с ответами:

Способ хранение данных в программе - C#
Имеется некоторое количество элементов у каждого элемента имеются свои свойства (могут быть числа и строки). Какой способ хранения...

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

Организация структуры для хранения данных - C#
Всем Привет! Может быть ошибся веткой... Есть БД в которой разные поля по типу, int, String, bool и т.д. Нужно организовать...

.NET 4.x Выбор коллекции для хранения данных - C#
Люди прошу помощи и совета. Возникла необходимость в программе сменить тип коллекции хранения данных (сейчас используются списки типа...


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

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

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