Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая сохранение\загрузка 
:(
    Опции темы
XperT
Дата 20.1.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Здравствуйте,

Есть программа которая сохраняет данные в локальные базы данных (в формате Absolute Database). В принципе как таковой необходимости использования баз данных нету, потому что программа при открытии проекта загружает все данные обычным Селектом, а при сохранении обновляет их. Был взят этот метод, потому что легко сохранять данные определённой стркутуры и в случае необходимости изменять саму структуру.

Но вот проблема в том, что сохранение и загрузка данных происходит довольно таки медленно и это ощущается на проектах в 2000+ записей. Хочу поменять формат на обычные текстовые файлы, но теперь возникает проблема выбора формата сохранения данных.

Первое, что пришло на ум использовать формат XML, но я не уверен на сколько быстро будет происходить работа з данным форматом. Потому у меня есть несколько вопросов (возможно кто-то стыкался с подобной проблемой и готов поделиться своими знаниями):
- рациональным ли есть использования XML формата сохранения данных в плане скорости?
- если да, то что лучше: использовать готовые парсеры XML или можно всё парсить вручную используя регулярки (опять таки в плане скорости)
- возможно есть готовые решения и мне не придётся изобретать велосипед?

Заранее благодарен за советы и указания smile

PM MAIL   Вверх
RockClimber
Дата 20.1.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 848
Регистрация: 5.5.2006
Где: планета 013 в тен туре

Репутация: нет
Всего: 15



Цитата(XperT @  20.1.2010,  13:14 Найти цитируемый пост)
- рациональным ли есть использования XML формата сохранения данных в плане скорости?

Ну конечно же нет. Если надо совсем быстро - то бинарные данные. Помнится, у Джоэла Спольски была статья на эту тему с примерами из Excel (он был одним из разработчиков). В ранних версиях Excel использовалась функция, которая писала произвольный кусок оперативной памяти на диск. Джоэл даже приводил какие-то расчеты вроде, XML проигрывает этой функции раз в 30... 
Статью искать лень.


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
XperT
Дата 20.1.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Цитата(RockClimber @ 20.1.2010,  16:03)
Цитата(XperT @  20.1.2010,  13:14 Найти цитируемый пост)
- рациональным ли есть использования XML формата сохранения данных в плане скорости?

Ну конечно же нет. Если надо совсем быстро - то бинарные данные. Помнится, у Джоэла Спольски была статья на эту тему с примерами из Excel (он был одним из разработчиков). В ранних версиях Excel использовалась функция, которая писала произвольный кусок оперативной памяти на диск. Джоэл даже приводил какие-то расчеты вроде, XML проигрывает этой функции раз в 30... 
Статью искать лень.

Спасибо, покопаю в эту сторону. Но мне кажется добавлять новые параметры будет проблематично при таком подходе...

З.Ы. И еще хотел спросить: скорость чтения и записи через текстовых файлов TStringList сильно уступает обычному readln/writeln?

Это сообщение отредактировал(а) XperT - 20.1.2010, 18:03
PM MAIL   Вверх
Dom
Дата 20.1.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Раньше тоже использовал ХМЛ для хранения данных, но с ростом размера файла пришлось отказаться. Много памяти расходовалось из-за специфической структуры данных. Кстати есть очень шустрые парсеры ХМЛ (например NativeXML, которым пользовался раньше). Не знаю насколько рационально, но сейчас я использую такой подход к хранению файлов в бинарном формате. Может изобретаю велосипед и кто-то предложит лучше.

Сперва создаю и сохраняю в файл массив состоящий из записей, каждая из которых хранит данные об определенной секции в файле (имя секции, начальная позиция в файле, размер секции, версия данных секции). За сохранение/загрузку каждого раздела данных отвечает своя процедура, соответствующей версии. Т.е. если надо что-то изменить в процедуре записи/чтения данных, то надо продублировать существующую процедуру, внести в нее желаемые изменения и присвоить ей следующий по порядку номер версии. Надеюсь понятно изложил. 

Кстати если будут другие идеи получше, то тоже буду рад выслушать.
PM MAIL   Вверх
amsoft
Дата 20.1.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



Цитата(XperT @  20.1.2010,  21:00 Найти цитируемый пост)
З.Ы. И еще хотел спросить: скорость чтения и записи через текстовых файлов TStringList сильно уступает обычному readln/writeln?


Особой разницы я не увидел (один и тот же текстовый файл (около 3000 строк) загружал обоими способами) - оба работают медленно, тоже хочу найти быстрый вариант загрузки.

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
XperT
Дата 21.1.2010, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Такс... пока что сошлись на том, что бинарные файлы быстрее всего. Но тут страдает удобство их использования (в основном в плане расширения сохраняемых параметров, а потому главное с самого начала нигде не лоханутся).

Возможно у кого то есть еще варианты в которых скорость/удобство использования имеют самые оптимальные значения?
PM MAIL   Вверх
~FoX~
Дата 21.1.2010, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(XperT @  20.1.2010,  14:14 Найти цитируемый пост)
- рациональным ли есть использования XML формата сохранения данных в плане скорости?

Нет, за счет чего, вы думаете, должна подняться скорость? БД выдает вам рекордсет на основе уже индексированных данных, нет накладных расходов на сортировку, фильтрацию, парсинг и т.д. В случае с ХМЛ 1. вся работа по описанию, индексации, выдачи/получении, и т.д. ляжет на вас. 2. Драйвер БД формирует рекордсет непосредственно в памяти и/или свопе, что в разы превосходми по скорости постоянное дергание винта. 

Цитата(XperT @  20.1.2010,  19:00 Найти цитируемый пост)
З.Ы. И еще хотел спросить: скорость чтения и записи через текстовых файлов TStringList сильно уступает обычному readln/writeln?

Зависит от загруженности системы.... TStrinGlist и еже с ними используют потоки для сохранения, соответственно на каждую итерацию возникает ожидание очереди...

Может быть стоит подумать над оптимизвацией имеющийся БД, например выбирать только те данные которые в данный момент нужны, или создать нужное количество словарей, а в главной таблице хранить лишь ссылки(key field например) на данные в этих словарях (связанные таблицы), тогда в таблице будут только числа, что сильно ускорит выдачу результатов со стороны драйвера, но придется все формировать руками на стороне клиента...

З.Ы.: 2000 записей в таблице, ИМХО капейки для нормально написанной БД  smile  


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
XperT
Дата 21.1.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Цитата(~FoX~ @ 21.1.2010,  07:37)
Цитата(XperT @  20.1.2010,  14:14 Найти цитируемый пост)
- рациональным ли есть использования XML формата сохранения данных в плане скорости?

Нет, за счет чего, вы думаете, должна подняться скорость? БД выдает вам рекордсет на основе уже индексированных данных, нет накладных расходов на сортировку, фильтрацию, парсинг и т.д. В случае с ХМЛ 1. вся работа по описанию, индексации, выдачи/получении, и т.д. ляжет на вас. 2. Драйвер БД формирует рекордсет непосредственно в памяти и/или свопе, что в разы превосходми по скорости постоянное дергание винта. 

Цитата(XperT @  20.1.2010,  19:00 Найти цитируемый пост)
З.Ы. И еще хотел спросить: скорость чтения и записи через текстовых файлов TStringList сильно уступает обычному readln/writeln?

Зависит от загруженности системы.... TStrinGlist и еже с ними используют потоки для сохранения, соответственно на каждую итерацию возникает ожидание очереди...

Может быть стоит подумать над оптимизвацией имеющийся БД, например выбирать только те данные которые в данный момент нужны, или создать нужное количество словарей, а в главной таблице хранить лишь ссылки(key field например) на данные в этих словарях (связанные таблицы), тогда в таблице будут только числа, что сильно ускорит выдачу результатов со стороны драйвера, но придется все формировать руками на стороне клиента...

З.Ы.: 2000 записей в таблице, ИМХО капейки для нормально написанной БД  smile

З базами данных работаю давно, как грамотно составить таблицы тоже знаю не по наслышке, так что работают они прилично быстро. Скорость не во время Селекстов огорчает, а во время по очередному считыванию записей и сохранению их в динамический массив. 

Тесты примерно такие:
Запрос: SELECT * FROM table ORDER BY field - время выполнения примерно 3 мс
Копирование записей в массив - время выполнения примерно 4 с

Это на таблице в 2617 записей и в БД размером 50 Мб (но там немного меньше будет, если очистить логи).

Как видно не смертельно медленно, но в очень больших таблицах время открытия проекта может достигать 20 сек, а это не очень приятно.

работать сразу с данными не могу, потому что будет еще медленнее (очень много операций которые обрабатывают все записи, потому работать с массивом рекордов быстрее чем делать кучу запросов в БД).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.