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

Вниз

Проблема нехватки памяти   Найти похожие ветки 

 
Разведка   (2012-08-31 22:19) [80]


> Sha ©   (31.08.12 22:01) [76]
> Сливаешь не так. Попробуй сортировку, а не IndexOf.

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


> картман ©   (31.08.12 22:06) [77]
> надеюсь, в FBList & FAList полные списки передаешь?


Туда только имена файлов словарей передавались. Добавляемые словари и базовые словари.


 
картман ©   (2012-08-31 22:20) [81]


> Добавляемые словари и базовые словари.

зачем несколько базовых словарей?


 
Игорь Шевченко ©   (2012-08-31 22:24) [82]

Разведка   (31.08.12 21:51) [73]

Феерично


 
Разведка   (2012-08-31 22:25) [83]


> картман ©   (31.08.12 22:20) [81]
> > Добавляемые словари и базовые словари.зачем несколько
> базовых словарей?


Ответ:

> Разведка   (31.08.12 20:49) [66]

+
> Sha ©   (31.08.12 21:02) [69]


 
Sha ©   (2012-08-31 22:25) [84]

> картман ©   (31.08.12 22:18) [79]
> да ну?

ну да


 
картман ©   (2012-08-31 22:29) [85]


> Разведка   (31.08.12 22:25) [83]

в итоге нужно получить <s>один</s> список?


> Sha ©   (31.08.12 22:25) [84]
>
> > картман ©   (31.08.12 22:18) [79]
> > да ну?
>
> ну да

глянул скорость чтения винчестеров - больше ста Мб/сек - за сколько тактов обязуешься обработать строку?


 
Игорь Шевченко ©   (2012-08-31 22:42) [86]


> глянул скорость чтения винчестеров - больше ста Мб/сек -
>  за сколько тактов обязуешься обработать строку?


http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-optimization-manual.pdf

Appendix C


 
Sha ©   (2012-08-31 22:44) [87]

> картман ©   (31.08.12 22:29) [85]
> глянул скорость чтения винчестеров - больше ста Мб/сек -
> за сколько тактов обязуешься обработать строку?


Получается 4 Гц / 0.1 Гб/сек = 40 тактов на байт.
Это гораздо больше, чем требуется для обработки данных.


 
sniknik ©   (2012-08-31 22:49) [88]

> Код я переделал кардинально и пошел путем который посоветовали эти участники
>> DVM ©   (29.08.12 22:51) [9] и Inovet ©
если ты про ссылку выше, то нет там ничего из посоветованого. в смысле работы с базой.

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

:)
ты еще не забыл, с начала ветки, это ты у народа спрашиваешь... не народ, ему пофиг на твои пер... поделки. он не тебя "из раннего творчества" изучает, а пытается решить чего у тебя не так, в том что делаешь, свежем ...эээ коде. а ты ему гуано ранней стадии окаменения подсовываешь.


 
Разведка   (2012-08-31 22:56) [89]


> Inovet ©   (31.08.12 10:05) [31]


Первоначальный код:

 for i:=0 to LVA.Items.Count-1 do begin
   Application.ProcessMessages;
   if Started = false then Break;
   try
   st := TStringList.Create;
   st.LoadFromFile(LVA.Items[i].Caption);
   for j:=0 to st.Count-1 do
   begin
     Application.ProcessMessages;
     if Started = false then Break;
     CurCount := j;
     if CheckWords(st.Strings[j]) = false then //т.е. нет дубля
     begin
       Table.Append;
       Table.FieldByName("words").AsString:=st.Strings[j];
       Table.Post;
       Inc(AddedCount);
     end
     else
     begin
       inc(DoubleWord);
       Continue;
     end;
   end;
   finally
     st.Free;
   end;
 end; 
 

заменил на это по рекомендации Inovet ©

       Par           := Query.Parameters.AddParameter;
       par.Name      := "StrValue";
       Par.DataType  := ftString;
       par.Direction := pdInputOutput;

       Query.Parameters.ParamByName("StrValue").Value := st.Strings[j];
       Query.SQL.Text := "INSERT INTO wordstabl (words) VALUES (:StrValue)";
       Query.ExecSQL;


Запущены две программы с двумя вариантами кода первый вариант был запущен еще вчера в 23 часа его состояние на сейчас:
обработано 30 млм.; скорость 23 слова/с. добавляет словарь в БД с 50 млн слов сутки.

Второй вариант кода был сделан сегодня вечером и запущен.
Произошло просто чудо какое то словарь в 50 млн. слов добавился в базу за пару часиков с лишним со скоростью ~530 слов/с.

теперь я думаю а что если алгоритм вынести в отдельный поток и убрать из цикла Application.ProcessMessages;? Мне кажется, что процедура затормаживает главный поток приложения прерывая для обработки сообщений.


 
Разведка   (2012-08-31 23:01) [90]


> sniknik ©   (31.08.12 22:49) [88]
> крутых алгоритмов оптимизации и хэшей т.д. типа, более сложного
> дать не рискну, народ не поймет...


Шутишь что ли, просто более сложного я и не делал и делать не рискую. ;-)


 
Sha ©   (2012-08-31 23:06) [91]

Ну, барин, ты задачки ставишь! За десять дней одному не справиться, помощник нужен. Homo sapiens.


 
Inovet ©   (2012-08-31 23:08) [92]

> [66] Разведка   (31.08.12 20:49)
> по 50 млн. строк каждый приблизительно 45-55 мб

Я уже сомневаться начал, кто из нас тупит.:(
Как файл с 50 млн. строк может быть 45-55 МБ?


 
картман ©   (2012-08-31 23:11) [93]


> Игорь Шевченко ©   (31.08.12 22:42) [86]


> Appendix C

я по ихнему не понимаю - в двух словах, если можно.


> Получается 4 Гц / 0.1 Гб/сек = 40 тактов на байт.
> Это гораздо больше, чем требуется для обработки данных.

правильнее, наверное, считать по строкам - сравнение строк, запись в хэш-таблицу, разрешение коллизий. У автора строки от 2-х до 32-х символов, пусть будет 200 тактов/строка. Думаешь, хватит?(понятия не имею, что там получается после компиляции)


 
sniknik ©   (2012-08-31 23:11) [94]

> заменил на это по рекомендации Inovet ©
уже не первый раз этот идиотизм с параметром перед запросом вижу... причем примечательно именно с Query... не Command.
наконец то виновник найден! Inovet готовься к КАРЕ!!!. :))


 
Разведка   (2012-08-31 23:15) [95]


> Inovet ©   (31.08.12 23:08) [92]
> > [66] Разведка   (31.08.12 20:49)> по 50 млн. строк каждый
> приблизительно 45-55 мбЯ уже сомневаться начал, кто из нас
> тупит.:(Как файл с 50 млн. строк может быть 45-55 МБ?


Это не точно. Если не веришь спроси у меня.
А лучше посмотри здесь, вот эти словари http://www.insidepro.com/dictionaries.php?lang=rus
"InsidePro (Full) - 1","InsidePro (Full) - 2" и т.д.
а к ними должны быть проверены другое множество словарей из других источников.


 
Sha ©   (2012-08-31 23:17) [96]

> 200 тактов/строка

думаю, можно уложиться, если использовать короткие строки


 
Разведка   (2012-08-31 23:17) [97]


> Разведка   (31.08.12 23:15) [95]


Опс.  в нолике ошибся т.е. не 50, а 5 млн. слов :)


 
картман ©   (2012-08-31 23:18) [98]

не, ну нули действительно бывает трудно пересчитать


 
Разведка   (2012-08-31 23:20) [99]


> sniknik ©   (31.08.12 23:11) [94]
> > заменил на это по рекомендации Inovet ©уже не первый раз
> этот идиотизм с параметром перед запросом вижу...


Он тут не причем, это мой идиотизм, но сперва тебе придется объяснить суть идиотизма прежде чем покараешь меня.


 
Inovet ©   (2012-08-31 23:21) [100]

> [89] Разведка   (31.08.12 22:56)
> заменил на это по рекомендации Inovet ©

Заменил, да не на то. Я тебе такого не советовал.


 
Inovet ©   (2012-08-31 23:22) [101]

> [94] sniknik ©   (31.08.12 23:11)
> наконец то виновник найден! Inovet готовься к КАРЕ!!!. :))

Посыпаю голову пеплом.


 
Игорь Шевченко ©   (2012-08-31 23:23) [102]

картман ©   (31.08.12 23:11) [93]


> я по ихнему не понимаю - в двух словах, если можно.


В двух словах - процессор быстрее


 
Inovet ©   (2012-08-31 23:24) [103]

> [95] Разведка   (31.08.12 23:15)
> Если не веришь спроси у меня.
> А лучше посмотри здесь, вот эти словари http://www.insidepro.com/dictiona
> ries.php?lang=rus

Что-то не вижу там таких соотношений чисел.


 
DVM ©   (2012-08-31 23:34) [104]


> Разведка  


По поводу базы. Я вот попробовал вставить строки в SQLite около миллиона строк вставилось за время меньшее минуты (я не засекал, но быстро очень).
1. Хочешь максимальной скорости - берешь SQLLite в однопоточном варианте. Или Firebird с локальным вариантом подключения.
2. Используй транзакции.
3. Убери все эти ParamByName и обращайся к параметру либо по номеру либо что еще лучше сам подставаляй в запрос - это значительно быстрее будет.


 
Разведка   (2012-08-31 23:34) [105]


> Inovet ©   (31.08.12 23:21) [100]
> Inovet ©Заменил, да не на то. Я тебе такого не советовал.
>


Ага ответственности испугался? :)


 
sniknik ©   (2012-08-31 23:37) [106]

> суть идиотизма
пытаешься "влезть в автобус, когда он еще не подъехал..." т.е. еще даже на горизонте не показался, а ты уже на место у остановки, где он только будет, ему на крышу вещи забрасываешь.


 
Разведка   (2012-08-31 23:45) [107]


> DVM ©   (31.08.12 23:34) [104]
> ..... что еще лучше сам подставаляй в запрос -
> это значительно быстрее будет.


Пройденный этап. Если подставлять непосредственно в запрос, то запросы нарываются на глюки с запятыми в запросе

Например:

StValue := "!""";
Query.SQL.Text := "SELECT * FROM wordstabl WHERE words = "+StValue;


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


 
Разведка   (2012-08-31 23:49) [108]


> sniknik ©   (31.08.12 23:37) [106]
> > суть идиотизмапытаешься "влезть в автобус, когда он еще
> не подъехал..." т.е. еще даже на горизонте не показался,
>  а ты уже на место у остановки, где он только будет, ему
> на крышу вещи забрасываешь.


Мне это не о чем не говорит, давай без жаргона уважаемый. Какой автобус какая крыша. По существу давай. Скажи как нужно и почему параметры опережают этого не недопонимаю, ведь ошибок не происходит.


 
sniknik ©   (2012-08-31 23:52) [109]

> По существу давай.
не получится, я ADOQuery-стам не помогаю. они не слушают. не желают.


 
DVM ©   (2012-08-31 23:54) [110]


> Разведка   (31.08.12 23:45) [107]


>  то запросы нарываются на глюки с запятыми в запросе

Это для тебя неразрешимая проблема? Ну нехай используй параметры, но хотя бы к параметру обращайся по номеру. Выкинь из цикла все лишние действия, всякие ProcessMessages и т.д. Вставляй данные пачками, скажем по 1000 делая коммит транзакции после каждой пачки (не факт что это ускорит на локальной базе, но тем не менее). Что за CheckWords() у тебя?


 
DVM ©   (2012-08-31 23:57) [111]


> Разведка   (31.08.12 23:49) [108]
>


>  ведь ошибок не происходит.

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


 
Разведка   (2012-09-01 00:15) [112]


> DVM ©   (31.08.12 23:54) [110]
>  Ну нехай используй параметры, но хотя бы к параметру обращайся
> по номеру. Выкинь из цикла все лишние действия, всякие ProcessMessages
> и т.д. Вставляй данные пачками, скажем по 1000 делая коммит
> транзакции после каждой пачки (не факт что это ускорит на
> локальной базе, но тем не менее). Что за CheckWords() у
> тебя?


Переделал параметры, но скорость не прибавилась

Query.SQL.Text := "INSERT INTO wordstabl (words) VALUES (:StrValue)";
Query.Parameters[0].Value := st.Strings[j];
Query.ExecSQL;


CheckWords - вот что Это такое

function TFrmMain.CheckWords(StValue: string): boolean;
var par: TParameter;
begin
 Query.SQL.Clear;
 Query.SQL.Text := "SELECT * FROM wordstabl WHERE words = :SFind";
 Query.Parameters[0].Value := StValue;
 Query.Open;
 if Query.IsEmpty then
 begin
   Result := false;
 end
 else begin
   Query.First;
   while Not Query.Eof do
   begin
     if Query.Fields[1].AsString = StValue then begin
       Result := true;
       exit;
     end;
     Query.Next;
   end;
 end;
end;


 
sniknik ©   (2012-09-01 00:17) [113]

DVM ©   (31.08.12 23:57) [111]
> подставку значения параметра надо
мало того что после назначения запроса, так это еще должно быть единственным назначением в цикле... иначе весь смысл параметра нивелируется.
а так как написано у автора, как ни крути, по логике, все "крутится" и пере назначается в цикле.


 
Разведка   (2012-09-01 00:21) [114]


> sniknik ©   (01.09.12 00:17) [113]


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


 
DVM ©   (2012-09-01 00:23) [115]


> Разведка   (01.09.12 00:15) [112]


> else begin
>    Query.First;
>    while Not Query.Eof do
>    begin
>      if Query.Fields[1].AsString = StValue then begin
>        Result := true;
>        exit;
>      end;
>      Query.Next;
>    end;
>  end;

Это что? Контрольный выстрел?


 
DVM ©   (2012-09-01 00:28) [116]


> Разведка   (01.09.12 00:15) [112]



Query.SQL.Text := "SELECT * FROM wordstabl WHERE words = :SFind";
...

function TFrmMain.CheckWords(const StValue: string): boolean;
begin
Query.Parameters[0].Value := StValue;
Query.Open;
Result := not Query.IsEmpty then
Query.close;
end;


 
картман ©   (2012-09-01 00:29) [117]

где-то выше было написано - регистр у него в БД не учитывается


 
sniknik ©   (2012-09-01 00:29) [118]

access как база не подойдет...
пока мы тут дурачились, закачал 3 словаря Russian (Full).dic, InsidePro (Full) - 1.dic, InsidePro (Full) - 2.dic
в таблицу ключ и индексированное значение, значение - VarChar(50)  (там пароли есть по 46 символов в длину) база получилась 661 мегабайт... очевидно, дальнейшее заполнение быстро превысит лимит в 2 гига...


 
Разведка   (2012-09-01 00:33) [119]


> DVM ©   (01.09.12 00:23) [115]


Ага он самый.
Я так сделал по то, что Ассess   в базе не учитывает регистр слов, там слово Арбуз = арбуз = арбуЗ - это дубликаты, а для меня это разные слова и должны присутствовать в базе.
>> Разведка   (31.08.12 18:46) [50]

Каждое слово нужно считать уникальным если оно отличается хотя бы регистром, например,
1. Арбуз - уникальное
2. арбуз - то же уникальное
3. аРбуз - то же уникальное

И они не должны считаться дубликатами. Пришлось химичить CheckWords


 
картман ©   (2012-09-01 00:34) [120]


> sniknik ©   (01.09.12 00:29) [118]

сколько уникальных значений и всего?



Страницы: 1 2 3 4 5 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.7 MB
Время: 0.081 c
2-1339967231
ankazh
2012-06-18 01:07
2013.03.22
DBLookupComboBox


2-1339658598
Lamer6666
2012-06-14 11:23
2013.03.22
DragAndDrop из браузера в приложение


15-1342729805
Юрий
2012-07-20 00:30
2013.03.22
С днем рождения ! 20 июля 2012 пятница


15-1345753802
Юрий
2012-08-24 00:30
2013.03.22
С днем рождения ! 24 августа 2012 пятница


2-1332353988
Pcrepair
2012-03-21 22:19
2013.03.22
Тип переменной для СТЕКа в Delphi. что выбрать?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский