Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

Прожорливый TStringList   Найти похожие ветки 

 
leonidus ©   (2005-08-31 12:57) [0]

Проблема вот в чем. Моя программа это англо-русский словарь. При запуске программы, из файла со словарем программа считывает все данные (т.е. англ.слова и соот. перевод)в TStringList. Слов порядка 100.000 в результате программа в памяти занимает больше 20 метров (без загрузки словаря она весит 10 метров). И вот вопрос, как бы этот размер уменьшить, может лучше создать просто массив и не париться с TstringList`ом, или есть какие-то другие механизмы реализации подобной задачи. Решение типа читать данные с диска только по требованию пользователя не катят - получается слишком медленно. Мастера, дайте совет.


 
Reindeer Moss Eater ©   (2005-08-31 13:01) [1]

может лучше создать просто массив и не париться с TstringList`ом

А типа массив будет хранить строки в соседней галактике, а не в памяти приложения?


 
alex_***   (2005-08-31 13:10) [2]

если хранить данные на диске в БД, то не нужно будет всё грузить - будет шустро работать по запросу. А 10 м в памяти когда ничего не загружено тоже не мало, кстати


 
IceBeerg ©   (2005-08-31 13:13) [3]

leonidus ©   (31.08.05 12:57)
Брось TStringList и воспользуйся советом от alex_***  у мня TStringList максимум 14 Мб из 49 метрового файла читает и все...


 
leonidus ©   (2005-08-31 13:24) [4]

БД, это конечно хорошо, но тогда нужно будет и движок с собой таскать, как быть?


 
Digitman ©   (2005-08-31 13:32) [5]


> тогда нужно будет и движок с собой таскать


кто тебе такое сказал ?

что, разве не существуют OpenSource-СУБД ?


 
alex_***   (2005-08-31 13:43) [6]

можно в dbf хранить и пользовать компоненты прямого доступа. Можно в access  и пользовать АДО. а можно и interbase встроенный себе закатать.


 
Reindeer Moss Eater ©   (2005-08-31 14:05) [7]

Есть выход и без движка БД.
Используй например TVirtualStringTree и загрузку/выгрузку по мере необходимости


 
Reindeer Moss Eater ©   (2005-08-31 14:11) [8]

результате программа в памяти занимает больше 20 метров (без загрузки словаря она весит 10 метров). И вот вопрос, как бы этот размер уменьшить

Решение типа читать данные с диска только по требованию пользователя не катят - получается слишком медленно.

То есть сейчас все работает быстро, но тебя смущает объем расходуемой прамяти и ты решил что-то улучшить?
А ты знаешь, какой средний объем RAM у продаваемых сегодня PC?


 
leonidus ©   (2005-08-31 14:20) [9]

>Reindeer Moss Eater я что-то не нашел у себя в Delphi класса TVirtualStringTree, где им можно разжиться?
На счет объемов оперативки осведомлен, но юзеры пишут что 20 метров которые занимает моя программа их напрягает, по
этому решил это дело оптимизировать, тем более что словарь растет да и не один он будет.

>alex_***  dbf это интересно, я с ним работал только через BDE, не подскажете статейку по прямому доступу? кстати а там можно базу зашифровать штатными средствами, что бы напрямую к файлу словаря доступа не было, только из моей программы?


 
Reindeer Moss Eater ©   (2005-08-31 14:24) [10]

Надо иметь проблему, понять в чем она состоит и искать пути её решения.
А какую проблему решаешь ты, и есть ли она вообще?

Пустой MSWord без документа, запустившись, съел у меня 33 м памяти.


 
Reindeer Moss Eater ©   (2005-08-31 14:30) [11]

>Моя программа это англо-русский словарь

>но юзеры пишут что 20 метров которые занимает моя программа их напрягает

У твоей программы есть пользователи?
Их напрягают 20 метров?
Тогда это в высшей степени странные чудаки.

Потому что они:
- не знают про существование промптов, лингво и т.д.
- их беспокоит объем занимаемой памяти, а не то, что они пользуются скверным софтом.

PS ничего личного
:)


 
leonidus ©   (2005-08-31 14:30) [12]

>Reindeer Moss Eater проблема простая - объем памяти занимаемый моей программой 20 метров и со временем за счер увеличения размера словарей будет только рости. Программа постоянно нашодится в памяти (в трее), и юзерам не нравится что она по их мнения, которая болжна быть маленькой и шустрой, занимает 20 мегов. Чем не проблема?


 
Reindeer Moss Eater ©   (2005-08-31 14:33) [13]

>Чем не проблема?

Тебе же сказали, не грузи все, используй БД.
Напрягает "таскать за собой движок"?
Ты же уже таскаешь многометровые словари с собой, а движок он легче намного.


 
Barloggg   (2005-08-31 14:35) [14]

Значит тебе придется создать оглавление для словаря. хе... как звучит однако...

Короче, разбей словарь хотя бы по первой букве и создай для каждой первой буквы свой TStringList и загружай по мере запроса.
А лучше создай для первых трех букв по своему TStringList.
Вот и все решение.


 
Reindeer Moss Eater ©   (2005-08-31 14:38) [15]

Моя программа это англо-русский словарь. При запуске программы, из файла со словарем программа считывает все данные (т.е. англ.слова и соот. перевод)в TStringList.

То есть твои мифические пользователи имеют нечто подобное:

mother=мама,мать
father=папа,отец
jack=розетка,грабитель

Ужосс какой....
:)


 
Barloggg   (2005-08-31 14:39) [16]

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


 
alex_***   (2005-08-31 14:42) [17]

Для дбф: TVKDBF


 
leonidus ©   (2005-08-31 14:53) [18]

>Reindeer Moss Eater да формат словаря как раз:
mother=мама,мать
father=папа,отец
jack=розетка,грабитель

а что в этом плохово?

У меня сейчас программа на винте занимает 2,5 метра, если к ней привинтить скажем BDE`шный движок это будет еще по моему 3 метра - не очень красиво, тем более придется движок еще устанавливать, вдруг там конфликты полезут...

>alex_*** TVKDBF сейчас скачаю, попробую что за зверь.

>Barloggg разбить-то можно я уже про такого рода индексацию думал, но в чем разница-то, всеравно придется все держать в памяти, я же не знаю какое слово от программы затребует юзер.
Двустороннего поиска не будет, для перевода в сторону русский-англ. есть отдельный словарь.


 
Reindeer Moss Eater ©   (2005-08-31 14:56) [19]

>а что в этом плохово?

Ты вообще в своей жизни иностранные словари видел?


 
Reindeer Moss Eater ©   (2005-08-31 15:02) [20]

если к ней привинтить скажем BDE`шный движок это будет еще по моему 3 метра - не очень красиво,

Меня всегда интересовал вопрос. Почему 2,5 метра - это еще достаточно красиво, а 3 метра - уже не очень красиво?

По моему, ты просто хочешь все запрограммировать мышкой.
Судя по топику твоя программа содержит три строчки твоего кода.
1. LoadFromFile
2. Получение MyList.IndexOf()
3. Отображение найденного, или сообщение что не найдено.

Маловато будет для программы, имеющей пользователей.
:)


 
Юрий Зотов ©   (2005-08-31 15:29) [21]

QDictionary.

Висит в трее, отъедает 11 метров памяти, переводит слова "на лету" (прямо с экрана, надо только навести на слово мышь и после небольшой паузы всплывает хинт с переводом, причем можно включить опцию "только при нажатой Ctrl"), имеет достаточно большой (и расширяемый пользователем) словарь, проста и удобна, не требует никаких дополнительных БД и движков, за примерно год ни одного глюка не замечено.

Думаю, что подобная программа далеко не единственная среди себе подобных. Так стоит ли изобретать велосипеды? Да еще более громоздкие, чем уже существующие?


 
Digitman ©   (2005-08-31 16:02) [22]


> leonidus ©   (31.08.05 14:53) [18]


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

Любая же сколь-либо серьезная/продуманная СУБД поступает иначе - она ИНДЕКСИРУЕТ табличные записи и постоянно держит в памяти лишь фрагменты индексных данных, в которых содержится инф-ция о смещениях записей отн-но начал таблиц .. Для быстрого доступа/считывания записи СУБД просматривает уже загруженные (или подгружаемые по мере необходимости) индексные данные (они уже заведомо упорядочены по тому или иному критерию), находит соответствие, считывает смещение и уже имея это смещение практически мгновенно позиционируется в соотв.таблице, считывая из нее в память действительно нужную (а не все подряд !) запись.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.057 c
6-1117619574
cyborg2004
2005-06-01 13:52
2005.09.25
Тип открытого файла в WebBrowser


14-1125915430
Signate
2005-09-05 14:17
2005.09.25
Opera


1-1125783213
kami
2005-09-04 01:33
2005.09.25
Потеря цвета в TImage


3-1123763303
Alex_
2005-08-11 16:28
2005.09.25
Проблема с кодировкой


1-1124119320
worldmen
2005-08-15 19:22
2005.09.25
Защита ПО.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский