Форум: "Прочее";
Текущий архив: 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.69 MB
Время: 0.08 c