Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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

 
Разведка   (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;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.063 c
2-1340362171
xss22
2012-06-22 14:49
2013.03.22
при переходе с D7 на XE


15-1330806605
Юрий
2012-03-04 00:30
2013.03.22
С днем рождения ! 4 марта 2012 воскресенье


15-1338185692
Екатерина
2012-05-28 10:14
2013.03.22
АРМ


15-1352493094
Дмитрий С
2012-11-10 00:31
2013.03.22
Вопрос по схемотехнике.


15-1350903963
asafr
2012-10-22 15:06
2013.03.22
Экскурс в будущее (заметки путешественника по времени)