![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение файла в Thread? [D7, WinXP]
Alex_C © (2011-09-29 12:22:00)Посоветуйте как правильно сделать:
есть локальная БД VolgaTable.
После каждого изменения в базе, фаил базы я записываю на диск.
Есть проблема: если в качестве диска использутся флешка, то сохранение происходит порядка 3 сек - что долго. Хочется этот процесс от пользователя "скрыть". Как идея - записывать на диск базе в отдельном Thread.
Вопрос: можно ли это делать? И если да, то как лучше это сделать?
Inovet (2011-10-01 13:13:00) [21]> [9] sniknik © (29.09.11 17:53)
> брать таблицу в памяти, и вместо изменений сохранять всю?
> где логика?
Флешку жалко
Inovet (2011-10-01 13:12:00) [22]> [6] Омлет © (29.09.11 15:56)
> для локальных БД так и не придумали
>
> SQLite.
Firebird embedded.
Атор таблицк называет базой?
sniknik (2011-10-01 11:20:00) [23]> Значит верное направление :)
два идиота нашли друг друга... совет вам да любовь.
на критику в нелогичности самой идеи внимания лучше не обращать... ну и что что для изменений единственной позиции делается перезапись всей много мегабайтной (иначе откуда тормоза в 3 сек?) таблицы? и хрен с ним что гробится флешка и т.д. там где любой нормальный движок изменит только саму запись (4кб если она в одном кластере диска) и займет это менее тысячной доли секунды на любом размере файла, без всяких извращений...
идиот уже решил, что выбранный им движок/логика работы самая верная, и просит он не советов, а подтверждений своему решению... на все остальное прикрыть глаза иначе не дай бог придется учить новое, и переделывать свое творение по каким то странным для него правилам работы из учебников... свой "велосипед" он же ближе к телу, роднее.
Alex_C (2011-10-01 09:37:00) [24]
> искать в компоненте SaveToStream и делать типа
Прикольно - именно так и сделал в итоге :)
А тут смотрю - и совет такой же. Значит верное направление :)
Slym (2011-09-30 06:48:00) [25]искать в компоненте SaveToStream и делать типа
db.SaveToStream(MemoryStream);//быстрая операция в памяти
ThreadSaveStream(MemoryStream);//в потоке не блокирую интерфейс сохраняем Stream
база не блокируется во время фонового сохранения
Ega23 (2011-09-29 21:25:00) [26]
> вообще ее последняя версия от 2006 года
вообще с 2006 года 5 лет прошло... :)
QAZ (2011-09-29 19:22:00) [27]
> я использую локальную БД VolgaTable - достаточно старенькая
> разработка 2000 года, но на мой взгляд ничего лучше для
> локальных БД так и не придумали. Жаль что автор прекратил
> ее поддержку.
вообще ее последняя версия от 2006 года
Cobalt (2011-09-29 18:20:00) [28]Частые перезаписи убивают флешку, как бы.
Так что в этом всё верно.
Представь, что вместо базы у тебя какой-нить txt или xml
На каждый чих записывать?
sniknik (2011-09-29 17:53:00) [29]> ваще не в тему. Не ускоришь.
только запутаешь... типа нажал на сохранить, оно мигнуло и сказало Ок, а сомо в это время в потоке пыжится, записывает... но пользователь уже видит Ок!!! и что ему мешает флешку выдернуть?
вот авто сохранение, типа "бекапа изменений в ворде" другое дело...
> После каждого изменения в базе, фаил базы я записываю на диск.
?
> но на мой взгляд ничего лучше для локальных БД так и не придумали.
брать таблицу в памяти, и вместо изменений сохранять всю? где логика?
Ega23 (2011-09-29 17:21:00) [30]
> у меня такой вопрос - нет ли каких ограничений на запись
> на диск при работе с Thread?
ИМХО, дополнительный tread тут ваще не в тему. Не ускоришь.
Alex_C (2011-09-29 17:13:00) [31]Немного не в тему: есть ли для SQLite надстройка, позволяющая использовать SQLite как и BDE (чтоб мого кода не перелапачивать)?
Омлет (2011-09-29 15:56:00) [32]> нет ли каких ограничений на запись на диск при работе с Thread
Всё те же, что и в основном потоке.
> достаточно старенькая разработка 2000 года, но на мой взгляд ничего лучше для локальных БД так и не придумали
SQLite.
Alex_C (2011-09-29 15:50:00) [33]Спасибо за ответы. Поясню - я использую локальную БД VolgaTable - достаточно старенькая разработка 2000 года, но на мой взгляд ничего лучше для локальных БД так и не придумали. Жаль что автор прекратил ее поддержку.
Работает этот компонент так: база целиком считывается в память, а на диск база сохраняется принудительно через SaveToFile.
С критическими секциями все понятно, у меня такой вопрос - нет ли каких ограничений на запись на диск при работе с Thread?
QAZ (2011-09-29 14:01:00) [34]
> сохранение происходит порядка 3 сек - что долго. Хочется
> этот процесс от пользователя "скрыть". Как идея - записывать
> на диск базе в отдельном Thread
а что будет,если пользователь не видя процесса сохранения решит выдернуть флешку?
Cobalt (2011-09-29 13:00:00) [35]А как ты с базой работаешь?
Считываешь полностью в память и загружаешь куда-то, или через компонент, который сам умеет записывать БД?
stas (2011-09-29 12:28:00) [36]Только я не понял, а база что не на диске хранится?
вообще не правильно перезаписывать всю БД при каждом изменении.
stas (2011-09-29 12:26:00) [37]Делаете Thread и выполняете в нем процедуру сохранения ).
Так же может понадобится CriticalSection, но это зависит от организации работы с Thread.
Вопрос общий, будут проблемы задавайте более конкретные вопросы...