Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сохранять строки в бинарных файлах? / 25 сообщений из 31, страница 1 из 2
07.01.2018, 13:34
    #39580282
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Есть набор больших текстовых файлов, которые для ускорения работы я конвертирую в удобный формат: парсю отдельные строки, укладываю преобразованные значения в поля в структуры, структуры укладываю в массив, а массив записываю в бинарный файл :)

Как быть с текстовыми полями:
1. Если в структуре объявить поле типа char [250], то это будет очень расточительно (не всем значениям нужна такая длина).
2. Если в структуре объявить поле std::string, то структура перестанет быть POD- объектом и работать с ней как с последовательностью битов уже будет нельзя. Как следствие отваливается возможность сохранения данных в файл.

Есть какие-то симпатичное решения сохранения текстовых данных в бинарных файлах?
...
Рейтинг: 0 / 0
07.01.2018, 13:51
    #39580291
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
"Симпатичные" это которые можно применять не задействуя мозг?..

STFW "сериализация в файл".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.01.2018, 14:12
    #39580296
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Dimitry SibiryakovSTFW "сериализация в файл".


Спасибо, уже читаю.
...
Рейтинг: 0 / 0
07.01.2018, 14:16
    #39580298
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Обычно ускорение и удобство - это два взаимоисключающих свойства.
...
Рейтинг: 0 / 0
07.01.2018, 14:27
    #39580301
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
авторСериализатор — наш самый страшный враг. Без него нам не обойтись, а он все шепчет о том, что если все оставить строками, то мы получим аналог динамической типизации. «И нет смысла трепыхаться, — говорит он, — ведь на стороне клиента от нас ждут строку JSON или XML. Зачем же нам целое число, храни в классе набор строк!» Страшные вещи творят несчастные разработчики, порабощенные таинственным шепотом, повсюду в их коде строки. Те же, что сильнее духом, но не окрепшие разумом, напротив, преобразуют зазря туда-сюда данные в байты и обратно. Радостно потирает руки Сериализатор, видя, как страдает эффективность.

...
Рейтинг: 0 / 0
07.01.2018, 14:29
    #39580302
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
...
Рейтинг: 0 / 0
07.01.2018, 15:25
    #39580314
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
У сериализации есть громадные минусы:
1. Все структуры разного размера, поэтому каждую структуру надо писать/читать в/из bin-файла отдельно. Т.е. нельзя записать/считать сразу 10 000 структур из файла.
2. Структуру нельзя писать/читать в/из bin-файла как единый объект. Надо работать с каждым полем отдельно.

Другими словами, такой способ не прокатит:
Код: plaintext
1.
2.
3.
cchar* pChar = (char*) ArrayOfStructure.begin();
std::streamsize MemorySize = ArrayOfStructure.Size() * sizeof(TypeStructure);
File.write(pChar, MemorySize);



Поэтому теряется скорость чтения bin-файла, ради которой все затевалось.

Возникает другое предложение: количество значений текстовых данных ограничено, поэтому можно создать отдельный файл с "Индексом" используемых значений строк, а в структурах хранить только номер индекса. Какой контейнер выбрать, чтобы осуществлялся быстрый поиск как по ключу (при чтении bin-файла), так и по значению (при записи bin- файла)?

Может я что-то неправильно понял и есть более простое решение?
...
Рейтинг: 0 / 0
07.01.2018, 15:36
    #39580316
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLСтруктуру нельзя писать/читать в/из bin-файла как единый объект. Надо работать с каждым полем отдельно.
Есть 2 варианта:
1. Работать с полями переменной длины сохраняя перед полем его длину (например), или в заголовке файла. Этот вариант "долгий", но подходит для строк любой длины и экономит место;
2. Работать со строками (полями) одинаковой длины, заранее известной. Это быстрый и самый удобный вариант, за исключением избыточности.

Какой выбрать в конкретном случае решает программист. Варианта "чтобы и строки разной длины и чтобы читалось сразу всё" нет.
...
Рейтинг: 0 / 0
07.01.2018, 15:55
    #39580320
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
По выбору контейнера: думаю надо использовать РАЗНЫЕ map при записи и чтении bin- файла. В первом случае ключом будет текстовая строка, а значением- индекс (так можно будет легко найти уже добавленное в индекс значение, чтобы избежать дублирования). При записи файла все наоборот: ключом будет индекс (указанный в сохраненной структуре), а значением будет текстовая строка.
...
Рейтинг: 0 / 0
07.01.2018, 15:57
    #39580322
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Я потихоньку из текстовых файлах создаю БД... Может в эту сторону лучше копать?
...
Рейтинг: 0 / 0
07.01.2018, 16:00
    #39580323
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQL,

Возможно, для твоей задачи вполне подойдет SQL))
Может, не надо заморачиваться?
...
Рейтинг: 0 / 0
07.01.2018, 16:01
    #39580324
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLЯ потихоньку из текстовых файлах создаю БД... Может в эту сторону лучше копать?Я не успел)
...
Рейтинг: 0 / 0
07.01.2018, 16:28
    #39580327
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLПо выбору контейнера: думаю надо использовать РАЗНЫЕ map при записи и чтении bin- файла. В первом случае ключом будет текстовая строка, а значением- индекс (так можно будет легко найти уже добавленное в индекс значение, чтобы избежать дублирования). При записи файла все наоборот: ключом будет индекс (указанный в сохраненной структуре), а значением будет текстовая строка.

UPDATE:
По выбору контейнера: думаю надо использовать РАЗНЫЕ map при записи и чтении bin- файла. В первом случае ключом будет текстовая строка, а значением- индекс (так можно будет легко найти уже добавленное в индекс значение, чтобы избежать дублирования). При чтении файла все наоборот: ключом будет индекс (указанный в сохраненной структуре), а значением будет текстовая строка.
...
Рейтинг: 0 / 0
07.01.2018, 16:39
    #39580329
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLМожет в эту сторону лучше копать?

Копай в сторону "а назачем я это вообще делаю?"

В зависимости от ответа на этот вопрос направления копания будут разными. От перехода на
потоковые алгоритмы обработки информации до создания индекса в памяти. Конвертирования
текстовых файлов в двоичные между ними почти наверняка не будет, ибо толку от него мало.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.01.2018, 19:44
    #39580356
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQL1. Все структуры разного размера, поэтому каждую структуру надо писать/читать в/из bin-файла отдельно. Т.е. нельзя записать/считать сразу 10 000 структур из файла.

Можно

Возникает другое предложение: количество значений текстовых данных ограничено, поэтому можно создать отдельный файл с "Индексом" используемых значений строк, а в структурах хранить только номер индекса. Какой контейнер выбрать, чтобы осуществлялся быстрый поиск как по ключу (при чтении bin-файла), так и по значению (при записи bin- файла)?

Может я что-то неправильно понял и есть более простое решение?
Развитие такой идеи возвращает тебя в далекие 80-е и 90-е когда "базы данных на файлах"
были популярны. Это dBase, Paradox, e.t.c. Кажется даже длинные строки в них именно так и хранились.
Короткие - хардкодились именно как поля фиксированного размера.

Собственно, цитата которую ты привел о том что сериализатор - враг, требует обсуждения.
Если враг - то в чём? В сложности разработки? В оверхеде?

Твои идеи по поводу оптимизации сохранения бинарных данных в файлах (ОСБДФ) как я уже
писал - устарели на 30 лет и тебе придётся во первых вступать в противостояние со "старичками"
которые уже "плавали" в этих технологиях и "знают" что почем. А новичкам соотв. будет пофиг
ибо для них не видно никакого профита кроме усложнения процесса разработки.
...
Рейтинг: 0 / 0
08.01.2018, 10:01
    #39580481
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
maytonAlekseySQL1. Все структуры разного размера, поэтому каждую структуру надо писать/читать в/из bin-файла отдельно. Т.е. нельзя записать/считать сразу 10 000 структур из файла.

Можно

Есть, конечно, вариант создать вторую структуру без текстовых полей, в нее перенести всё нетекстовое и тогда можно сохранять массово. А текстовые поля сохранить как одну большую строку, полученную конкатенацией всех строк. Но мне этот способ кажется трудно- поддерживаемым: никто потом не вспомнит этот "финт ушами".

maytonВозникает другое предложение: количество значений текстовых данных ограничено, поэтому можно создать отдельный файл с "Индексом" используемых значений строк, а в структурах хранить только номер индекса. Какой контейнер выбрать, чтобы осуществлялся быстрый поиск как по ключу (при чтении bin-файла), так и по значению (при записи bin- файла)?

Может я что-то неправильно понял и есть более простое решение?
Развитие такой идеи возвращает тебя в далекие 80-е и 90-е когда "базы данных на файлах"
были популярны. Это dBase, Paradox, e.t.c. Кажется даже длинные строки в них именно так и хранились.
Короткие - хардкодились именно как поля фиксированного размера.

Например, 1с версии 7.7 хранила свои данные в dbf- файлах (продукт сдал позиции 8.х версиям примерно 10 лет назад). Строки хранились кратными 80 (например, если юзер ввел комментарий документа на 79 символов,то использовалась одна запись, а если накропал 81 символ, то тут уже было не обойтись без двух записей). В новых версиях есть строка неограниченной длины, способ её хранения зависит от СУБД...
...
Рейтинг: 0 / 0
08.01.2018, 10:04
    #39580482
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
YuRockВозможно, для твоей задачи вполне подойдет SQL))
Может, не надо заморачиваться?

Решил вернуться к идее использования map в качестве индекса, потому что полученная выборка из БД потребует дальнейшей конвертации в объекты С++ (и как следствие- потеря эффективности). Я ищу решение максимальное для скорости чтения данных, поэтому этот вариант не айс.
...
Рейтинг: 0 / 0
08.01.2018, 12:00
    #39580495
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLYuRockВозможно, для твоей задачи вполне подойдет SQL))
Может, не надо заморачиваться?

Решил вернуться к идее использования map в качестве индекса, потому что полученная выборка из БД потребует дальнейшей конвертации в объекты С++ (и как следствие- потеря эффективности). Я ищу решение максимальное для скорости чтения данных, поэтому этот вариант не айс.
Изобретаешь In-Memory DBMS ? :)
...
Рейтинг: 0 / 0
09.01.2018, 16:09
    #39581143
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AlekseySQLЕсть какие-то симпатичное решения сохранения текстовых данных в бинарных файлах?1) Текстовые данные планируется только читать?
2) Насколько большие файлы?
...
Рейтинг: 0 / 0
09.01.2018, 18:02
    #39581220
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
AmKadAlekseySQLЕсть какие-то симпатичное решения сохранения текстовых данных в бинарных файлах?1) Текстовые данные планируется только читать?
2) Насколько большие файлы?

1. Сначала 1 раз записать, потом все оставшиеся разы только читать.
2. ~60ГБ csv- файлов.
...
Рейтинг: 0 / 0
10.01.2018, 13:06
    #39581682
Как сохранять строки в бинарных файлах?
Я бы все хранил в SQLite. Очень просто и очень удобно. Из минусов, по сравнению с самописным форматом, только скорость линейного чтения, но это уже от задачи зависит.
...
Рейтинг: 0 / 0
10.01.2018, 13:33
    #39581700
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
А я бы вообще всё оставил в текстовых файлах и применял однопроходные алгоритмы для обработки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.01.2018, 14:47
    #39581754
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Соискатель С++Я бы все хранил в SQLite. Очень просто и очень удобно. Из минусов, по сравнению с самописным форматом, только скорость линейного чтения, но это уже от задачи зависит.

Вот это меня в SQL и напрягает: можно выбирать либо построчно, либо все гаком. А мне надо кусками по 10 000 записей, чтобы оперативка не забилась от всей выборки данных. Конечно, есть и свои плюсики: быстрые отборы, сортировка, но это не моя задача.
...
Рейтинг: 0 / 0
10.01.2018, 14:49
    #39581756
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Dimitry SibiryakovА я бы вообще всё оставил в текстовых файлах и применял однопроходные алгоритмы для обработки.


А у меня и так последовательное считывание строк из тексового файла. Да и дело не столько в считывании данных, сколько в их преобразовании в int, long, bool... Поэтому преобразую в BIN- формат.
...
Рейтинг: 0 / 0
10.01.2018, 14:52
    #39581758
Amiri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сохранять строки в бинарных файлах?
Код: plaintext
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.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
struct R
{
    int Number;
    AnsiString Name;
    AnsiString MecTo;
    AnsiString KJIuKyxa;
    AnsiString nac;
    AnsiString gon_nac;
    AnsiString MbIJIo;
    AnsiString uHfa;
    bool exist;
    int kol;
};
 
//--------------Массив типа R------------
R b[5000];
 
//--------------Запись массива в файл-----------
void TFormMain::RtoFile(String name, R *Rec)
{
 
 FILE * pFile;
 AnsiString bufname = name + ".psw";
 pFile = fopen(bufname.c_str(), "wb");
 for(int i = 0 ; i < 5000 ; i++)
 {
  if(Rec[i].exist)
  {
 
   int
    sizeNumber = sizeof(Rec[i].Number),
    sizeName = Rec[i].Name.Length(),
    sizeMecTo = Rec[i].MecTo.Length(),
    sizeKJIuKyxa = Rec[i].KJIuKyxa.Length(),
    sizenac = Rec[i].nac.Length(),
    sizegon_nac = Rec[i].gon_nac.Length(),
    sizeMbIJIo = Rec[i].MbIJIo.Length(),
    sizeuHfa = Rec[i].uHfa.Length(),
    sizeexist = sizeof(Rec[i].exist),
    sizekol = sizeof(Rec[i].kol);
 
   fwrite(&sizeNumber, sizeof(int), 1, pFile);
   fwrite(&sizeName, sizeof(int), 1, pFile);
   fwrite(&sizeMecTo, sizeof(int), 1, pFile);
   fwrite(&sizeKJIuKyxa, sizeof(int), 1, pFile);
   fwrite(&sizenac, sizeof(int), 1, pFile);
   fwrite(&sizegon_nac, sizeof(int), 1, pFile);
   fwrite(&sizeMbIJIo, sizeof(int), 1, pFile);
   fwrite(&sizeuHfa, sizeof(int), 1, pFile);
   fwrite(&sizeexist, sizeof(int), 1, pFile);
   fwrite(&sizekol, sizeof(int), 1, pFile);
 
   fwrite(&Rec[i].Number, sizeNumber, 1, pFile);
   fwrite(&Rec[i].kol, sizekol, 1, pFile);
   fwrite(&Rec[i].exist, sizeexist, 1, pFile);
 
   char buf [1];
 
   strcpy(buf, Rec[i].Name.c_str());
   fwrite(&buf, sizeName, 1, pFile);
 
   strcpy(buf, Rec[i].MecTo.c_str());
   fwrite(&buf, sizeMecTo, 1, pFile);
 
   strcpy(buf, Rec[i].KJIuKyxa.c_str());
   fwrite(&buf, sizeKJIuKyxa, 1, pFile);
 
   strcpy(buf, Rec[i].nac.c_str());
   fwrite(&buf, sizenac, 1, pFile);
 
   strcpy(buf, Rec[i].gon_nac.c_str());
   fwrite(&buf, sizegon_nac, 1, pFile);
 
   strcpy(buf, Rec[i].MbIJIo.c_str());
   fwrite(&buf, sizeMbIJIo, 1, pFile);
 
   strcpy(buf, Rec[i].uHfa.c_str());
   fwrite(&buf, sizeuHfa, 1, pFile);
  }
 }
 fclose (pFile);
}
 
//----------Считывание из файла------------
void TFormMain::RfromFile(String name, R Rec[])
{
 int counter = 0;
 FILE *pFile = NULL;
 AnsiString bufname = name + ".psw";
 pFile = fopen(bufname.c_str() , "rb");
 if(pFile == NULL)
  return;
 for(int i = 0; i < 5000; i++)
 {
    int
    sizeNumber = 0,
    sizeName = 0,
    sizeMecTo = 0,
    sizeKJIuKyxa = 0,
    sizenac = 0,
    sizegon_nac = 0,
    sizeMbIJIo = 0,
    sizeuHfa = 0,
    sizeexist = 0,
    sizekol = 0;
 
   fread(&sizeNumber, sizeof(int), 1, pFile);
   fread(&sizeName, sizeof(int), 1, pFile);
   fread(&sizeMecTo, sizeof(int), 1, pFile);
   fread(&sizeKJIuKyxa, sizeof(int), 1, pFile);
   fread(&sizenac, sizeof(int), 1, pFile);
   fread(&sizegon_nac, sizeof(int), 1, pFile);
   fread(&sizeMbIJIo, sizeof(int), 1, pFile);
   fread(&sizeuHfa, sizeof(int), 1, pFile);
   fread(&sizeexist, sizeof(int), 1, pFile);
   fread(&sizekol, sizeof(int), 1, pFile);
 
   fread(&Rec[i].Number, sizeNumber, 1, pFile);
   fread(&Rec[i].kol, sizekol, 1, pFile);
   fread(&Rec[i].exist, sizeexist, 1, pFile);
 
   char buf[1];
 
   fread(&buf, sizeName, 1, pFile);
   Rec[i].Name = buf;
 
   fread(&buf, sizeMecTo, 1, pFile);
   Rec[i].MecTo = buf;
 
   fread(&buf, sizeKJIuKyxa, 1, pFile);
   Rec[i].KJIuKyxa = buf;
 
   fread(&buf, sizenac, 1, pFile);
   Rec[i].nac = buf;
 
   fread(&buf, sizegon_nac, 1, pFile);
   Rec[i].gon_nac = buf;
 
   fread(&buf, sizeMbIJIo, 1, pFile);
   Rec[i].MbIJIo = buf;
 
   fread(&buf, sizeuHfa, 1, pFile);
   Rec[i].uHfa = buf;
 }
 fclose(pFile);
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сохранять строки в бинарных файлах? / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]