Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПроблема нехватки памяти Найти похожие ветки
← →
Разведка (2012-08-29 20:23) [0]Почему в TStrings не вмещается 350 миллионов строк приблизительно 350 мгб. Выходит сообщение о нехватке памяти. Сколько вообще может вместить в себя TStringList? TStringList.count - тип integer и переменные у класса как минимум integer должны вмещать до 2 млрд.-ов .
← →
Inovet © (2012-08-29 20:26) [1]> [0] Разведка (29.08.12 20:23)
> 350 миллионов строк приблизительно 350 мгб
Каждая строка по 1 байту? Даже по 0 байтов, даже ещё меньше.
← →
Медвежонок Пятачок © (2012-08-29 20:36) [2]Почему в TStrings не вмещается 350 миллионов строк?
Почему в TStrings?
Не в TStrings, а в память
← →
Inovet © (2012-08-29 20:51) [3]И вообще стоит подумать над пересмотром архитектуры - 350 млн строк грузить в память рановато ещё.
← →
Разведка (2012-08-29 20:51) [4]Ну это и имел ввиду просто объяснять не умею
← →
Разведка (2012-08-29 20:54) [5]
> Inovet © (29.08.12 20:51) [3]
Может и рановато, а чем можно заменить TStrings?
← →
Inovet © (2012-08-29 20:55) [6]> [2] Медвежонок Пятачок © (29.08.12 20:36)
> Не в TStrings, а в память
> [0] Разведка (29.08.12 20:23)
> StringList.count - тип integer и переменные у класса как
> минимум integer должны вмещать до 2 млрд.-ов .
Обязан вместить и память при этом не трогать, память нам ещё для другого нужна.
← →
Inovet © (2012-08-29 20:56) [7]> [5] Разведка (29.08.12 20:54)
> Может и рановато, а чем можно заменить TStrings?
А что делать-то надо с этими строками? Может БД, может файл какой.
← →
Разведка (2012-08-29 22:48) [8]
> Inovet © (29.08.12 20:56) [7]
> > [5] Разведка (29.08.12 20:54)> Может и рановато, а чем
> можно заменить TStrings?А что делать-то надо с этими строками?
> Может БД, может файл какой.
Бд - нет не Бд, у меня словари в тхт формате... много словарей и большие , но разные и в них слова дублируются. Нужно убить дубликаты сразу во всех словарях, а маленькие те что останутся объединить в большие словари.
← →
DVM © (2012-08-29 22:51) [9]
> Разведка (29.08.12 22:48) [8]
ну вот загони все в бд, ее средствами обработай данные, потом если нужно обратно в текстовый файл - выгрузи обратно.
← →
Разведка (2012-08-29 23:08) [10]
> DVM © (29.08.12 22:51) [9]
Бд умрет в обработке... обработка в текстовых файлах - это самый быстрый вариант при проверке одного слова в файле с 50 млн. слов уходит 1 сек. если это будет БД то может быть уйдет времени секунд 10-20 ... есть ли смысл? у меня 24 файла по 50 млн. слов -это базовые словари и к ними нужно проверить еще словарей более десятка в сумме 2-3 слов. В общем этакая непосильная задача. Я вообще пытаюсь придумать алгоритм этой задачи раскидав на 8 потоков под AMD 8-соrе FX-8150
← →
DVM © (2012-08-29 23:12) [11]
> Разведка (29.08.12 23:08) [10]
>
> > DVM © (29.08.12 22:51) [9]
>
>
> Бд умрет в обработке...
да ладно, скажи это яндексу гуглу и прочим
> обработка в текстовых файлах - это самый быстрый вариант
> при проверке одного слова в файле с 50 млн. слов уходит
> 1 сек.
поиск в текстовом файле заведомо не может быть быстрее поиска в бд по полю имеющему индекс, поиск в файле - тупой перебор, поиск в бд - в худшем случае бинарный.
← →
Разведка (2012-08-29 23:22) [12]
> DVM © (29.08.12 23:12) [11]
В таком случае какая БД оптимально подошла бы к этой задаче? Я бы хотел что бы учитывалась многоядерность FX-8150 и возможность подключения сразу нескольких клиентов по словарю на клиента на 5 компьютеров. Firebird -?
← →
DVM © (2012-08-29 23:24) [13]
> Firebird -?
вполне подойдет
вообще с привлечением субд задача становится совсем простой, самое долгое в ней - это перегон твоих файлов в бд, займет в зависимости от мощности машины максимум час.
← →
Inovet © (2012-08-29 23:29) [14]> [10] Разведка (29.08.12 23:08)
> Бд умрет в обработке...
Такую пукалку и не заметит, а ты будешь изобретать то, что в БД сделано.
← →
Дмитрий С © (2012-08-29 23:55) [15]Даже Access, думаю, не затупил бы.
← →
Inovet © (2012-08-30 00:01) [16]> [13] DVM © (29.08.12 23:24)
> самое долгое в ней - это перегон твоих файлов в бд
Ну и индексы отключить перед загоном, потом создать.
← →
Разведка (2012-08-30 02:38) [17]
> Дмитрий С © (29.08.12 23:55) [15]
> Даже Access, думаю, не затупил бы.
Сделаю, посмотрим, потестим затем код сброшу на посмотреть.
Да, так бы мне хорошо жить как вы говорите ;-)
← →
картман © (2012-08-30 02:42) [18]
> Разведка (30.08.12 02:38) [17]
>
> Да, так бы мне хорошо жить как вы говорите ;-)
не слушай их, вот: http://www.algolib.narod.ru/Sort/PolyPhaseMerge.html - идеально подходит:)
← →
Anatoly Podgoretsky © (2012-08-30 09:15) [19]Даже если сохранять пустые! строки в массив и то надо 1,4 гигабайта, а если строки хотя бы из одного символа то уже 5 гибабайт. У тебя есть XE2 с виндоус x64 и минимум с 16 гигабайтами? Если нет то и не надейся
← →
Разведка (2012-08-31 01:26) [20]Уже сделал по быстрому на ADO Access по прежнему не высокая сначала была 811 слов/с щас уже упала до 260 слов/с.
Все равно придется многопоточность делать. При моем подсчете при текущей скорости один словарь 50 млн. слов будет обрабатываться 53 часа, а еще 23 таких же словаря и +21. Вот задачка?
← →
Inovet © (2012-08-31 01:27) [21]> [20] Разведка (31.08.12 01:26)
Ты индексы правильные создал?
← →
Разведка (2012-08-31 01:28) [22]
> Anatoly Podgoretsky © (30.08.12 09:15) [19]
> Даже если сохранять пустые! строки в массив и то надо 1,
> 4 гигабайта, а если строки хотя бы из одного символа то
> уже 5 гибабайт. У тебя есть XE2 с виндоус x64 и минимум
> с 16 гигабайтами? Если нет то и не надейся
Уменя FX-8150 +win7 64, а память купить можно.
← →
Разведка (2012-08-31 01:32) [23]
> Inovet © (31.08.12 01:27) [21]
> > [20] Разведка (31.08.12 01:26)Ты индексы правильные
> создал?
Я базу в стандартном accsse создавал, поле поставил индексированное, в коде делфи уже никаких индексов не создавал.
← →
Inovet © (2012-08-31 01:39) [24]> [23] Разведка (31.08.12 01:32)
Значит что-то ты не то делаешь.
← →
Разведка (2012-08-31 01:43) [25]
> Inovet © (31.08.12 01:39) [24]
> > [23] Разведка (31.08.12 01:32)Значит что-то ты не то
> делаешь.
вот он, лежит здесь http://www.fayloobmennik.net/2158253
Выглядит пока как попало, если есть желание можешь глянуть. на сегодня все.
← →
Германн © (2012-08-31 03:14) [26]
> Выглядит пока как попало, если есть желание можешь глянуть.
И ты действительно думаешь, что у кого-то появится желание взглянуть на "как попало"?
← →
Разведка (2012-08-31 07:57) [27]
> Германн © (31.08.12 03:14) [26]
Э, какие претензии? тебе же никто это не впаривает?
← →
Студент (2012-08-31 08:35) [28]Зачем function SetPoint(Real):string; ?
Есть же и регулярки и pos, почему Real а не Integer?
function GetFileSizeFormat опять же есть просто format в стандартной библиотеке.
Exit в самых неожиданных местах бесит. Заполнение через post, хотя там можно было выполнить insert и не задерживать память, пост по сравнению с простым запросом insert больше операций выполняет. Про скорость есть еще предподготовленные запросы в Query которые выполняются моментом, все под запрос уже заточено осталось получить данные. Опять же весь файл грузиться в list вместо последовательного считывания, память сразу отожрет только в путь. ИМХО тут не знание SQL и БД.
← →
Студент (2012-08-31 08:36) [29]зы
unit2 потерялся, от него только dcu.
← →
Inovet © (2012-08-31 09:45) [30]> [28] Студент (31.08.12 08:35)
Я так и предполагал. Загнал в базу, а работает как и раньше с файлом.
В БД предложили для чего? Чтобы её средствами обработать.
← →
Inovet © (2012-08-31 10:05) [31]Вот на кой грузить в стринг лист весь файл, чтобы потом по одной строчке добавлять в таблицу? Все что, читать из файла разучились/неумеют?
Мильон раз писалось - не пользуйтесь TADOTable, всем пофиг. И методы соответсвующие. Про SQL не слышал никогда?
← →
Студент (2012-08-31 10:07) [32]Inovet © (31.08.12 09:45) [30]
Пытается загнать все в БД, но как то странно. Кроме того SQL и использование Query построено странно. Что со структурой БД вообще не понятно. Про считывание, это list.loadfromfile у него обьемы бешанные, но все равно файл целиком грузит.
← →
Inovet © (2012-08-31 10:19) [33]Вот поэтому 57 (или сколь там) суток считает.
SELECT * FROM wordstabl WHERE words = :SFind
Дубли надо в запросе убирать, а не запрос на каждое слово.
← →
stas © (2012-08-31 11:19) [34]Разведка (31.08.12 01:28) [22]
Вот пристал со своим FX-8150 )
возьми MSSQL там эту задачу можно решить с помощью TSQL без программы на Delphi.
← →
Anatoly Podgoretsky © (2012-08-31 11:49) [35]> stas (31.08.2012 11:19:34) [34]
И в Дельфи с эту задачу можно решить с помощью TSQL без программы на
SSMS/SSIS. Единственная разница - не сможет сделать ряд ошибок.
← →
Студент (2012-08-31 12:38) [36]stas © (31.08.12 11:19) [34]
bash + grep
← →
sniknik © (2012-08-31 13:33) [37]> При моем подсчете при текущей скорости один словарь 50 млн. слов будет обрабатываться 53 часа, а еще 23 таких же словаря и +21. Вот задачка?
офигеть, при таком подсчете/реализации и всего 53 часа? в мелкософте гении!
+
при 50 тыс в базе, больше тысячи дублей, т.е. > 2% "мусора", для 50 млн. думаю процентное отношение вырастет.
← →
Дмитрий С © (2012-08-31 13:38) [38]А что нужно, отсортировать 350 млн строк?
← →
Sha © (2012-08-31 13:46) [39]> Разведка
Сколько уникальных значений должно остаться в конце концов?
Поместятся ли эти уникальные значения в ОП?
Зачем надо куда-то грузить?
← →
Павиа (2012-08-31 15:22) [40]Хе-ХЕ. Задача на сортировку 22 файлов с 50 миллионов слов с индексами и их слияния и последующее удаление дублей.
На линуксе можно очень быстро сделать за час. Или на почти любой БД.
← →
Sha © (2012-08-31 15:33) [41]как только люди жили без БД
← →
Дмитрий С © (2012-08-31 15:47) [42]
> На линуксе можно очень быстро сделать за час. Или на почти
> любой БД.
>
Да это задача из разряда не "Как сделать", а "Просто надо взять и сделать". Тут даже обсуждать то нечего.
← →
sniknik © (2012-08-31 16:01) [43]> и последующее удаление дублей.
> На линуксе можно очень быстро сделать за час. Или на почти любой БД.
как однако линукс влияет на сознание... трудолюбие воспитывает.
у меня так даже мысли не возникло о "последующем" удалении, думал сразу, в одно действие, при добавлении "отсекать". способов хватает.
← →
Павиа (2012-08-31 18:14) [44]Это не линукс. Это я просто на много проходную обработку подсел. Так алгоритм нагляднее получается чем потоковая обработка. Хотя иногда наоборот создает трудности.
← →
Студент (2012-08-31 18:19) [45]Sha © (31.08.12 15:33) [41]
Под это и придумали компутер, все остальное побочное явление.
← →
Разведка (2012-08-31 18:31) [46]Ответ для всех.
Да что бы я так жил как вы все говорите.
1. Не сама задачка сложна, а ее реализация. Я всех тонкостей не знаю, что работает быстрее, а что не быстрее, например незнал, что TADOTable - тормоз.
2. что плохого загрузить весь файл в память, есть память ее нужно использовать всю, при построчном чтении вот точно тормоза будут, диск как минимум читает блоками, а не байтами, а при чтении по одной строке в несколько байт это не рационально. для примера скопируй из файла "А" 50мб. в файл "Б" все по 1 байту и увидите сколько он будет копироваться по сравнению когда будете копировать большими блоками.
> Inovet © (31.08.12 10:19) [33]
> Вот поэтому 57 (или сколь там) суток считает.SELECT * FROM
> wordstabl WHERE words = :SFindДубли надо в запросе убирать,
> а не запрос на каждое слово.
Это как? Я не понимаю. Я так сделал по то, что Ассess слова в базе не учитывают регистр там слово Арбуз = арбуз = арбуЗ - это дубликаты, а для меня это разные слова и должны присутствовать в базе.
← →
Кукарямба (2012-08-31 18:35) [47]
> Нужно убить дубликаты сразу во всех словарях, а маленькие
> те что останутся объединить в большие словари.
Дональд Эрвин Кнут, Искусство программирования, том 3. Сортировка и поиск.
> не вмещается 350 миллионов строк
...
> и в них слова дублируются.
Это в каком это языке 350 миллионов слов? Пусть даже с дубликатами. Или там дубликатов дофига?
← →
Разведка (2012-08-31 18:40) [48]
> Кукарямба (31.08.12 18:35) [47]
Да! Есть! Слушаюсь! Капитан очевидность!
А еще нужно убить дубликаты не только внутри словарей, а и между словарями.
← →
Sha © (2012-08-31 18:40) [49]> Разведка
на [39] ответь
← →
Разведка (2012-08-31 18:46) [50]Каждое слово нужно считать уникальным если оно отличается хотя бы регистром, например,
1. Арбуз - уникальное
2. арбуз - тоже уникальное
3. аРбуз - тоже уникальное
И они не должны считаться дубликатами
> Поместятся ли эти уникальные значения в ОП?Зачем надо куда-
> то грузить?
- про это я не понял о чем речь
← →
Разведка (2012-08-31 18:51) [51]
> Разведка (31.08.12 18:46) [50]
> > Поместятся ли эти уникальные значения в ОП?
Если ОП имелось ввиду оперативная память, то от чего бы им туда не поместиться, сколько нужно столько ее и будет в данном случае у меня 4гб и еще 8гб могу добавить.
← →
Sha © (2012-08-31 18:57) [52]1. Сколько уникальных значений должно остаться в конце концов?
10? 100? 100000?
2. Поместятся ли эти уникальные значения в ОП?
Или среднюю/максимальную длину слова приведи.
3. Зачем надо куда-то грузить?
Почему нельзя формировать результат в процессе чтения всех этих txt-файлов?
← →
DVM © (2012-08-31 19:13) [53]Автор похоже с субд мало знаком, задача сама по себе элементарная скрость добавления слов и скрость поиска на порядки выше у среднестатистической субд
Субд для ьаких задач вмегда будет удобнее так поимк в ней мгновенный
← →
Разведка (2012-08-31 19:33) [54]
> Sha © (31.08.12 18:57) [52]
> 1. Сколько уникальных значений должно остаться в конце концов?
> 10? 100? 100000?2. Поместятся ли эти уникальные значения
> в ОП?Или среднюю/максимальную длину слова приведи.3. Зачем
> надо куда-то грузить?Почему нельзя формировать результат
> в процессе чтения всех этих txt-файлов?
Все просто.
1. неограничено
2. размер занимаемой памяти = сумме всех словарей - это теоретически 350 = 400 мб. в БД под строку выделено 32 байта + Ключ(счетчик).
3. Словари эти не просто слова, а база паролей поэтому они уникальны в базе уже писал >> Разведка (31.08.12 18:46) [50]
← →
картман © (2012-08-31 19:41) [55]
> 2. размер занимаемой памяти = сумме всех словарей - это
> теоретически 350 = 400 мб.
пароли по 1-2 однобайтовых символа? Или не 350 млн строк? 350 млн пользователей?
← →
Разведка (2012-08-31 19:42) [56]
> Inovet © (31.08.12 10:05) [31]
> TADOTable, всем пофиг. И методы соответсвующие. Про SQL
> не слышал никогда?
Заменил TADOTable на ADOQueryPar := 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;
Скорость та же ничего не изменилось, и постепенно идет к уменьшению
← →
Sha © (2012-08-31 19:42) [57]> Разведка
Ты противоречишь сам себе:
350 миллионов строк * 32 байта > приблизительно 350 мб
← →
Разведка (2012-08-31 19:49) [58]
> картман © (31.08.12 19:41) [55]
> > 2. размер занимаемой памяти = сумме всех словарей - это
> > теоретически 350 = 400 мб.пароли по 1-2 однобайтовых символа?
> Или не 350 млн строк? 350 млн пользователей?
сам то посчитай
пароли длиной 2-3 символа при алфавите a-z = 3^26; a-z + A-Z = 3^42 ну и т.д. там разной длины слова
← →
Inovet © (2012-08-31 19:55) [59]> [57] Sha © (31.08.12 19:42)
> Ты противоречишь сам себе:
Да в самом начале про это говорили, похоже не понял автор.
← →
Разведка (2012-08-31 19:55) [60]
> > Разведка Ты противоречишь сам себе:350 миллионов строк
> * 32 байта > приблизительно 350 мб
Не противоречу
350 миллионов строк в файлах слловарей приблизительно каждый из них около 50 мгб их размер разный так как и слова разной длины, а вот в базе длина поля фиксирована по 32 байта. Выполняется такая операция из файлов .txt слова переносятся в БД при этом нужно убить дубликаты, так как во многих словарях повторы.
← →
картман © (2012-08-31 20:02) [61]1 мегабайт = 1024 * 1024 байт
1 миллион = 1000 * 1000
*SCRATHC*
1 миллион строк = 1000 * 1000 строк
← →
Разведка (2012-08-31 20:07) [62]
> Разведка (31.08.12 19:55) [60]
а может и в самом деле уже зарапортовался, я уже не помню чего там в начале ветки было.
← →
Sha © (2012-08-31 20:12) [63]> Разведка
Тогда в чем проблема-то, 350мб свободно в ОП влезут.
Время обработки словарей = времени их чтения в ОП.
← →
картман © (2012-08-31 20:19) [64]
> Время обработки словарей = времени их чтения в ОП.
научи
← →
Sha © (2012-08-31 20:25) [65]> картман
в процессе чтения помещаем данные в хеш-таблицу
← →
Разведка (2012-08-31 20:49) [66]
> Sha © (31.08.12 20:12) [63]
> > РазведкаТогда в чем проблема-то, 350мб свободно в ОП влезут.
> Время обработки словарей = времени их чтения в ОП.
А вот чего то не влазят, ексепшион вываливает. после загрузки 7-го словаря в память.
Общее количество словарей 25 по 50 млн. строк каждый приблизительно 45-55 мб. в сумме 1.2 гб. Значит я их пытался загрузить в TStringList, что бы объединить в один словарь и начать проверять на дубликаты другие дополнительные словари с этим гигантским, но после добавления в TStringList на 7 словаре происходит ошибка скажем, что нехватка памяти, хотя по всем видимым признакам памяти должно хватать с избытком ОП 3 Гб. на компьютере. Вот из-за этого и возникла эта ветка.
← →
Разведка (2012-08-31 20:53) [67]
> Разведка (31.08.12 20:49) [66]
А ~350 мб. это просто тот предел на котором возникает ошибка поэтому здесь и зациклились на этой цифре.
← →
Sha © (2012-08-31 20:54) [68]> вот чего то не влазят
не так делаешь
← →
Sha © (2012-08-31 21:02) [69]если не устраивает [65], то с минимальными исправлениями своего алгоритма
можешь подгружать по одному словарю, удалять дубликаты, снова подгружать и т.д.
← →
Разведка (2012-08-31 21:22) [70]
> Sha © (31.08.12 21:02) [69]
> своего алгоритмаможешь подгружать по одному словарю, удалять
> дубликаты, снова подгружать и т.д.
Опять начинаю по кругу отвечать, именно так и сделал как ты предлагаешь , но задача теперь уперается в низкую скорость и производительность я об этом уже написал здесь ранее. Мы с участниками этого форума уже перешли ко второму этапу реализации задачи - это оптимизация или подбора самого оптимального варианта реализации алгоритма и мне многое уже посоветовали и я уже многое сделал как советовали.
← →
Sha © (2012-08-31 21:35) [71]> именно так и сделал как ты предлагаешь ,
> но задача теперь уперается в низкую скорость
не верю, код покажи
← →
Плохош (2012-08-31 21:38) [72]
> код покажи
испугаться хочешь?
← →
Разведка (2012-08-31 21:51) [73]
> Sha © (31.08.12 21:35) [71]
> > именно так и сделал как ты предлагаешь , > но задача теперь
> уперается в низкую скоростьне верю, код покажи
Может быть уже и не совсем так ведь каждый имеет свое на уме. Код я переделал кардинально и пошел путем который посоветовали эти участники
> DVM © (29.08.12 22:51) [9] и Inovet ©
Но впрочем, еще что то осталось. Не помню какой вариант окончательный или промежуточный. Я пытался один добавляемый словарь проверить с 25 другими словарями (т.е. они были базовыми) по очереди в цикле.
Здесь самая примитивщина никаких крутых алгоритмов оптимизации и хэшей т.д.
unit DicThreade;
interface
uses
SysUtils, Windows, Classes, MsgLog;
Type TThrStat = (TS_STARTED,TS_END);
Type
TTstatInfo = Record
BaseDic : String;
AddDic : String;
DublCount : Integer;
NewWords : Integer;
CurCount : Integer;
End;
type
TDicProc = class(TThread)
Status : TThrStat;
CurCount : Integer;
BaseDic : String;
AddDic : String;
DublCount: Integer;
AddCount : Integer;
private
FMsg : Cardinal;
FWnd : THandle;
FAList : TStrings;
FBList : TStrings;
protected
procedure Execute; override;
public
Constructor Create(AList, BList: TStrings; Wnd:THandle; Msg: Cardinal);
Constructor Destroy;
end;
implementation
Uses Unit1;
constructor TDicProc.Create(AList, BList: TStrings; Wnd: THandle;
Msg: Cardinal);
begin
inherited Create(false);
FWnd := Wnd;
FMsg := Msg;
FAList := TStringList.Create;
FBList := TStringList.Create;
FAList.Text := AList.Text;
FBList.Text := BList.Text;
end;
constructor TDicProc.Destroy;
begin
inherited Destroy;
FAList.Free;
FBList.Free;
end;
procedure TDicProc.Execute;
var
Asl,Bsl,Nsl: TStrings;
i,ACnt,BCnt,DublCnt,Cnt: Integer;
s: string;
begin
{
if FAList.Count = 0 then begin
SendDebugMsgLastError("NewThread.Execute error:",GetLastError,0);
Exit;
end;
}
Status := TS_STARTED;
try
Asl := TStringList.Create; //Asl - Add String list
Bsl := TStringList.Create; //Bsl - Base String lisl
Nsl := TStringList.Create; //Tsl - Temp String List
ACnt := 0;
while Acnt <> FAList.Count do
begin
//SendDebugMsg("FAList = "+FAList.Strings[Acnt]);
Asl.Clear;
Asl.LoadFromFile(FAList.Strings[Acnt]);
AddDic := FAList.Strings[Acnt];
Bcnt := 0;
while Bcnt <> FBList.Count do
begin
//SendDebugMsg("FBList = "+FBList.Strings[BCnt]);
BaseDic := FBList.Strings[BCnt];
Bsl.Clear;
Bsl.LoadFromFile(FBList.Strings[BCnt]);
Cnt := 0;
While Cnt <> Asl.Count do
begin
CurCount := Cnt;
if Bsl.IndexOf(Asl.Strings[Cnt]) = -1 then
begin
Nsl.Add(Asl.Strings[Cnt]);
AddCount := Nsl.Count;
Inc(Cnt);
continue;
end;
Inc(DublCount);
Inc(Cnt);
end;
Inc(BCnt);
end;
//Save Asl Result;
inc(ACnt);
end;
finally
Asl.Free;
Bsl.Free;
Nsl.Free;
end;
end;
end.
← →
Sha © (2012-08-31 21:52) [74]> испугаться хочешь?
ага, фильмы пересмотрел все, что были )
← →
Разведка (2012-08-31 22:01) [75]
> Разведка (31.08.12 21:51) [73]
Даже не до конца было реализовано, скорость выполнения не понравилась перешел на другой вариант с базами данных.
← →
Sha © (2012-08-31 22:01) [76]Сливаешь не так. Попробуй сортировку, а не IndexOf.
← →
картман © (2012-08-31 22:06) [77]
> Sha © (31.08.12 20:25) [65]
>
> > картман
>
> в процессе чтения помещаем данные в хеш-таблицу
не получится так же быстро
> Разведка (31.08.12 21:51) [73]
шикарно))
надеюсь, в FBList & FAList полные списки передаешь?
← →
Sha © (2012-08-31 22:16) [78]> картман © (31.08.12 22:06) [77]
> не получится так же быстро
Точно.
Процессор обрабатывает данные быстрее, чем происходит их чтение с жесткого диска )
← →
картман © (2012-08-31 22:18) [79]
> Процессор обрабатывает данные быстрее, чем происходит их
> чтение с жесткого диска )
да ну?
← →
Разведка (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]
сколько уникальных значений и всего?
← →
sniknik © (2012-09-01 00:34) [121]> 661 мегабайт
объем конечно можно уменьшить, например использовав тип "сжатые строки", но это будет "как мертвому припарки".
← →
картман © (2012-09-01 00:35) [122]
> Пришлось химичить CheckWords
Query.Locate глянь
← →
DVM © (2012-09-01 00:37) [123]
> Разведка (01.09.12 00:33) [119]
> Я так сделал по то, что Ассess в базе не учитывает регистр
> слов
Ну и выкинь его, возьми Firebird с самого же начала хотел. Тем более что [118]
← →
sniknik © (2012-09-01 00:40) [124]> Пришлось химичить CheckWords
есть такое слово как бинарное сравнение
> сколько уникальных значений и всего?
т.к., оказалось, нужны все варианты с буквами в разных регистрах то ... не знаю, не сравнивал пока. а всего 13066561 записей. может быть все будут уникальны, по новым веяниям.
← →
Разведка (2012-09-01 00:41) [125]
> sniknik © (01.09.12 00:29) [118]
тогда придется пожертвовать длиной ограничить до длины 24 байт, ведь в природе вряд ли найдешь даже длиннее 16 байт пароли.
← →
картман © (2012-09-01 00:43) [126]
> Разведка (01.09.12 00:41) [125]
а что потом?
← →
sniknik © (2012-09-01 00:45) [127]> до длины 24 байт
с математикой не лады? "мертвый" все еще труп. даже если считать буквально -> / 2, хотя VarChar это нифига не пополам...
← →
Разведка (2012-09-01 00:45) [128]
> DVM © (01.09.12 00:37) [123]
Так и придется сделать, Ассess - это так был эксперимент, но хотолось бы вместе с программой и базу переносить.
← →
DVM © (2012-09-01 00:48) [129]Firebird тоже есть локальный а еще лучше sqlite
← →
Разведка (2012-09-01 00:48) [130]
> картман © (01.09.12 00:43) [126]
> > Разведка (01.09.12 00:41) [125]а что потом?
Как говорят суп с котом, главное не что потом, а что сейчас. Смотри как многому меня здесь научили.
← →
картман © (2012-09-01 00:56) [131]
> Смотри как многому меня здесь научили.
да уж, эти изверги хоть кого научат
← →
Разведка (2012-09-01 01:08) [132]
> DVM © (01.09.12 00:48) [129]
> Firebird тоже есть локальный а еще лучше sqlite
А почему лучше? Я пока более склоняюсь к firebird
1. Много документации на русском.
2. ближе всего к синтаксису Делфи и "интербаз" и есть хроший инструментарий IBExpert
3. уже немного знаком даже делал учебную базу.
sqlite - тоже заинтересовала.
← →
Германн © (2012-09-01 01:56) [133]
> картман © (01.09.12 00:56) [131]
>
>
> > Смотри как многому меня здесь научили.
>
> да уж, эти изверги хоть кого научат
>
Всех научить всё равно не получается даже у "этих извергов" :)
Иногда попадаются слишком "неподдающиеся" обучению.
← →
картман © (2012-09-01 01:59) [134]
> Иногда попадаются слишком "неподдающиеся" обучению.
это и подразумевал
← →
Германн © (2012-09-01 02:29) [135]
> картман © (01.09.12 01:59) [134]
>
>
> > Иногда попадаются слишком "неподдающиеся" обучению.
>
> это и подразумевал
Кто хочет учиться, тому помогут, если он действительно хочет!
А все прочие в последнее время предпочитают другие форумы. :)
← →
Разведка (2012-09-01 12:23) [136]
> Германн © (01.09.12 02:29) [135]
> А все прочие в последнее время предпочитают другие форумы.
> :)
Это какие другие? Можно озвучить, а то уже заинтриговало. Форумы то хоть для программистов или так на девок голых посмотреть?
← →
Студент (2012-09-02 07:03) [137]google + форум программистов
← →
RWolf © (2012-09-02 11:45) [138]на форумах не учат, а всего лишь указывают на очевидные ошибки.
в данном случае автору остро не хватает теоретической подготовки; рекомендуется пройти курс реляционной алгебры и СУБД.
От себя порекомендовал бы стэнфордский онлайн-курс "Introduction to Databases" на coursera.org, если с английским порядок.
← →
Разведка (2012-09-03 00:27) [139]
> RWolf © (02.09.12 11:45) [138]
> на форумах не учат, а всего лишь указывают на очевидные
> ошибки.в данном случае автору остро не хватает теоретической
> подготовки; рекомендуется пройти курс реляционной алгебры
> и СУБД.От себя порекомендовал бы стэнфордский онлайн-курс
> "Introduction to Databases" на coursera.org, если с английским
> порядок.
Вся проблема в том, что на все про все времени не хватает... Работа дурацкая 100% времени занимает нет ни минуты покоя к тому же не связана с компьютерами вообще. Делаю программы это просто хобби.
← →
картман © (2012-09-03 01:06) [140]
> рекомендуется пройти курс реляционной алгебры
ядерная бомбардировка скворечника уместней будет
← →
Pavia © (2012-09-03 06:22) [141]Автору явно не хватает знаний, причём по всем направлениям.
← →
stas © (2012-09-03 10:41) [142]Pavia © (03.09.12 06:22) [141]
>Автору явно не хватает знаний, причём по всем направлениям.
Зато у него AMD FX8150!
← →
Разведка (2012-09-03 13:52) [143]
> Pavia © (03.09.12 06:22) [141]
> Автору явно не хватает знаний, причём по всем направлениям.
>
Автору не только не хватает знаний, но и времени на получения этих знаний.
Знания - то такая специфическая вещь, которой всегда не будет хватать, будь вы трижды профессором. "Чем больше я знаю, то более убеждаюсь, что ничего не знаю"
← →
Разведка (2012-09-09 01:25) [144]Как связать компоненты в "рантайм"? Хочу вынести работу с базой в отдельный поток. Сделал такой код, но чего то неработает.
constructor TDicProc.Create(AList: TStrings; BaseFile, ParamFile: String; Wnd:THandle);
begin
inherited Create(false);
FWnd := Wnd;
FAList := TStringList.Create;
FAList.Text := AList.Text;
if FAList.Count = 0 then Terminate;
IBDatabase := TIBDatabase.Create(Nil);
IBQuery := TIBQuery.Create(Nil);
IBTransaction := TIBTransaction.Create(Nil);
IBTransaction.Name := "IBTransaction";
IBDatabase.Name := "IBDatabase";
IBQuery.Name := "IBQuery";
With IBDatabase do
begin
LoginPrompt := false;
DatabaseName := BaseFile;
Params.LoadFromFile(ParamFile);
Connected := true;
DefaultTransaction := IBTransaction;
end;
IBTransaction.DefaultDatabase := IBDatabase;
IBTransaction.Active := true;
IBQuery.Database := IBDatabase;
IBQuery.Transaction := IBTransaction;
end;
← →
Разведка (2012-09-09 05:56) [145]Переделал все. Базу сделал на FireBird. Теперь работает в отдельном потоке, но скорости так и не прибавилось еще хуже стало. скорость упала 20 слов в сек.
Код потока:unit DicThreade;
interface
uses
SysUtils, Windows, Classes,IBDatabase, DB, IBCustomDataSet, IBQuery, MsgLog;
Type TThrStat = (TS_STARTED,TS_STOP,TS_END,TS_ERR);
Type
TTstatInfo = Record
BaseDic : String;
AddDic : String;
DublCount : Integer;
NewWords : Integer;
CurCount : Integer;
End;
type
TDicProc = class(TThread)
Status : TThrStat;
CurCount : Integer;
BaseDic : String;
AddDic : String;
DublCount: Integer;
AddCount : Integer;
IBDatabase: TIBDatabase;
IBQuery: TIBQuery;
IBTransaction: TIBTransaction;
private
FMsg : Cardinal;
FWnd : THandle;
FAList : TStrings;
FBList : TStrings;
protected
procedure Execute; override;
public
Constructor Create(AList: TStrings; BaseFile, ParamFile: String; Wnd:THandle);
Destructor Destroy; override;
//Procedure Free;
end;
implementation
constructor TDicProc.Create(AList: TStrings; BaseFile, ParamFile: String; Wnd:THandle);
begin
inherited Create(false);
FWnd := Wnd;
FAList := TStringList.Create;
FAList.Text := AList.Text;
if FAList.Count = 0 then Terminate;
IBDatabase := TIBDatabase.Create(Nil);
IBTransaction := TIBTransaction.Create(Nil);
IBQuery := TIBQuery.Create(Nil);
IBTransaction.Name := "IBTransaction";
IBDatabase.Name := "IBDatabase";
IBQuery.Name := "IBQuery";
With IBDatabase do
begin
LoginPrompt := false;
DatabaseName := BaseFile;
Params.LoadFromFile(ParamFile);
Connected := true;
DefaultTransaction := IBTransaction;
end;
IBTransaction.DefaultDatabase := IBDatabase;
IBTransaction.Active := true;
IBQuery.Database := IBDatabase;
IBQuery.Transaction := IBTransaction;
FreeOnTerminate := true;
end;
destructor TDicProc.Destroy;
begin
FAList.Free;
IBTransaction.Commit;
IBQuery.Free;
IBTransaction.Free;
IBDatabase.Free;
inherited Destroy;
end;
procedure TDicProc.Execute;
var
Asl: TStrings;
i,j,DublCnt,Cnt: Integer;
begin
if Not IBDatabase.Connected then begin
Status := TS_ERR;
Exit;
end;
if Not IBTransaction.Active then begin
Status := TS_ERR;
Exit;
end;
Status := TS_STARTED;
try
Asl := TStringList.Create; //Asl - Add String list
AddCount := 0;
for i:=0 to FAList.Count -1 do
begin
Asl.Clear;
Asl.LoadFromFile(FAList.Strings[i]);
AddDic := FAList.Strings[i];
//SendDebugMsg(FAList.Strings[i]+" Count = "+IntToStr(Asl.Count));
Cnt := 0;
While Cnt <> Asl.Count do
begin
if Status = TS_STOP then
begin
Exit;
end;
//SendDebugMsg("Cnt"+IntToStr(Cnt));
IBQuery.SQL.Text := "SELECT WORD_PWD FROM WORDS WHERE WORD_PWD = :StrValue";
IBQuery.Params[0].AsString := Asl.Strings[Cnt];
IBQuery.Open;
if Not IBQuery.IsEmpty then
begin
//SendDebugMsg("duble word = "+Asl.Strings[cnt]);
Inc(DublCount);
Inc(Cnt);
CurCount := Cnt;
Continue;
end;
//SendDebugMsg("added word = "+Asl.Strings[cnt]);
IBQuery.SQL.Text := "INSERT INTO WORDS (WORD_PWD) VALUES (:StrValue)";
IBQuery.Params[0].AsString := Asl.Strings[Cnt];
IBQuery.ExecSQL;
//IBTransaction.Commit;
Inc(AddCount);
Inc(Cnt);
CurCount := Cnt;
end;
end;
finally
Asl.Free;
end;
end;
end.
← →
sniknik © (2012-09-09 09:21) [146]>> По существу давай.
> не получится, я ADOQuery-стам не помогаю. они не слушают. не желают.
как знал
> DVM © (31.08.12 23:57) [111]
>> подставку значения параметра надо
> мало того что после назначения запроса, так это еще должно быть единственным назначением в цикле... иначе весь смысл параметра нивелируется.
> а так как написано у автора, как ни крути, по логике, все "крутится" и пере назначается в цикле.
не зависит от компонент, судя по всему, они вторичны, сначала "мозги набекрень", а компоненты после под них подбирают.
и кстати про то, что потоки не для скорости, тоже где то там говорил...
← →
Inovet © (2012-09-09 09:37) [147]> [145] Разведка (09.09.12 05:56)
Ты скопировал всё тоже самое на ФБ. Почему не учитываешь рекомендации нескольких человек, приведённые выше? ТАК работать будет плохо хоть на миллионпроцессорном железе с супер SQL сервером.
← →
sniknik © (2012-09-09 10:14) [148]++
у каждой субд свои особенности, тут мало код в дельфе исправить тут и запросы нужно с учетом субд делать... и подумать например как объединить оба запроса в один... или сделать операцию массовой (если возможно). как он работает с транзакциями, какое оптимальное количество для записи...
вот когда учтешь все, и сделаешь все оптимально, тогда и скорость будет.
а то что ты сейчас приводишь, это то же самое г. только в другой обертке. вкуснее не стало.
← →
brother © (2012-09-09 10:35) [149]по ссылке:
http://www.insidepro.com/dictionaries.php?lang=rusПаролей
Программа Extreme GPU Bruteforcer обновлена
а что пишет автор в итоге то? кто понял? ;)
← →
Inovet © (2012-09-09 10:54) [150]> [149] brother © (09.09.12 10:35)
> а что пишет автор в итоге то? кто понял? ;)
Допустим, защиту от ввода пользователями засвеченных пароле.:)
← →
brother © (2012-09-09 10:57) [151]> защиту от ввода пользователями засвеченных пароле
ага, в общем понятно...
← →
sniknik © (2012-09-09 12:25) [152]> ага, в общем понятно...
тут ситуация почти как в старом анекдоте -
1945 год. Новгородская область. Сидит партизан-диверсант на рельсах и пытается
их взорвать. Но зажечь бикфордов шнур не так-то просто. Спички - г..но, не
зажигаются. Вдруг чувствует партизан (П), что кто-то трогает его за плечо.
Оборачивается - немец(Н). - Ооо, русский партисан -говорит (Н) и берет из рук
(П) коробок спичек. (Н) Читает то, что написано на спичках:
- Фаприка "Красний Октиапрь",
- Кород Чудово. После этого отдает коробок (П):
- Ну тавай, тавай..
← →
brother © (2012-09-09 12:52) [153]хм, я другой вариан слышал:
О, балабаново? Ну, тафай, тафай ;)
← →
Разведка (2012-09-09 14:06) [154]
> sniknik © (09.09.12 10:14) [148]
На fireBird переведено по объективным причинам:
1. АDO access ограничено размером базы не более 2 гиг. т.е. все словари туда уже не влезут.
2. АDO Аccess не учитывает регистр слов в базе об этом уже говорилось Разведка (31.08.12 18:46) [50]. поэтому пришлось делать дополнительную функцию Разведка см. (01.09.12 00:15) [112]
> sniknik © (09.09.12 09:21) [146]
И так параметры. Тут без параметров нельзя, т.к. символы идут с кавычками если запрос сделать без параметра, то на запрос с аргументом !" или aaa" - рушатся.
> sniknik © (09.09.12 09:21) [146]
> и кстати про то, что потоки не для скорости, тоже где то
> там говорил...
- Почему в поток? потому что бы избавиться в цикле отApplication.ProcessMessages;
Наверняка знаешь что это и зачем. Так оно же тормозит процесс заставляя его каждый цикл прерываться и выполнять обработку поступающих сообщений к окну вот это самый главный тормоз циклов. И что будет если его убрать, да то что окно тупо зависнет и не будет отвечать на действия пользователя бока не завершится цикл.
Я вот чего не сделал, и пока не могу разобраться как сделать.
1. не создал индекс , пока просто не понимаю как проиндексировать поле в fireBird. Таблица всего пока из 2-х полей [ID] - ключевое, счетчик [word_pwd] - Char 32.
2. В Субд можно использовать хранимые процедуры, одну на добавление записи уже знаю как сделать, а вот на проверку дубликата пока нет.
← →
Разведка (2012-09-09 14:13) [155]
> Inovet © (09.09.12 10:54) [150]
ТоварЫщ совершенно прав, именно это и делается.
А вообще у нас в бывшем СССР все имело двойную суть, т.е. создавалось по теории двойного назначения. ;-)
← →
Плохиш © (2012-09-09 14:52) [156]
> И так параметры. Тут без параметров нельзя, т.к. символы
> идут с кавычками если запрос сделать без параметра, то на
> запрос с аргументом !" или aaa" - рушатся.
Как всегда, в кривых руках кто угодно виноват, только не их владелец.
Что я не так делаю, что у меня символы с кавычками не рушат ни запросы с параметрами, ни запросы без параметров?
← →
sniknik © (2012-09-09 15:01) [157]как интересно поворачивается разговор...
стоит сказать, что не место в цикле для присвоения запроса, так один понимает что именно там, и так его нужно делать, но у него не получается (и он считает что параметры только ради этого, что чтобы получилось), а у другой теперь начинает убеждать, что "все работает", и 0 оба внимания на суть.
;((
а суть буквальна... стоит прочитать как есть - "внутри цикла... коней на переправе не меняют!".
← →
Плохиш © (2012-09-09 15:15) [158]
> sniknik © (09.09.12 15:01) [157]
Ну во-первых, я отвечал только на-то, что процитировал. А во-вторых, какая может быть "суть" в ветке по основам программирования в 15й десятке постов?
← →
Разведка (2012-09-09 15:23) [159]
> sniknik © (09.09.12 15:01) [157]
> как интересно поворачивается разговор...стоит сказать, что
> не место в цикле для присвоения запроса, так один понимает
> что именно там, и так его нужно делать, но у него не получается
> (и он считает что параметры только ради этого, что чтобы
> получилось), а у другой теперь начинает убеждать, что "все
> работает", и 0 оба внимания на суть.;((а суть буквальна.
> .. стоит прочитать как есть - "внутри цикла... коней на
> переправе не меняют!".
А может быть столь явное для одного пока не столь очевидно для обоих, может быть пока боремся с противоречиями нет что бы просто взять и сделать? Я по крайней мере хоть к какому то результату добрался и на этом опыт поимею. Просто не хватает времени во всем разобраться основательно. Вот сейчас нужно решать проблему с поступлением в ВУЗ что то застряло мое оформление. Затем с работой - нужно ее менять. В общем столько всего, что почти мало время остается на более глубокое изучение.
← →
Разведка (2012-09-09 15:34) [160]
> sniknik © (09.09.12 15:01) [157]
Да потому, что большие ветки это зло, пока дочитаешь уже не помнешь что было в начале. Да потому, что каждый имеет своим долгом выразиться да так запредельно абстрактно в высоких материях, что потом гадай о чем было сказано. У меня в программировании не высокие показатели и попросту некоторые ваши высокие идеи пролетают у меня над головой, а я только документы сдал на поступление в универ да я даже и не учился еще нигде толком, так какой спрос с меня?
← →
sniknik © (2012-09-09 15:38) [161]> не столь очевидно для обоих
говори за себя. Плохиш понял см. [158].
> нет что бы просто взять и сделать?
без проблем. возьми и сделай. мешает кто-то? или это предложение нам? тогда где ТЗ, + цена этого предложения? и кстати не адресу, это тебе на фриланс нужно.
> Просто не хватает времени во всем разобраться основательно.
найми программиста.
← →
sniknik © (2012-09-09 15:41) [162]> запредельно абстрактно в высоких материях
что запредельно непонятного в моих словах? если конечно подумать. вот конкретно в том утверждении про цикл, и запрос в нем???
← →
Sha © (2012-09-09 15:41) [163]> Разведка
Ну, вот представь, будет у тебя очень большой словарь, да еще в базе.
Что дальше делать будешь? Нужна тебе проверка по такому словарю?
В нем, к примеру, есть пароль мамапапажабацап123, но нет мамапапажабацап124.
← →
Sha © (2012-09-09 15:45) [164]Т.е. ты получишь словарь и неполный, и тяжелый одновременно.
← →
sniknik © (2012-09-09 15:48) [165]> запредельно абстрактно в высоких материях
++
если не понятно, почему не переспросил? вот именно об этом не понятном... зачем сам начал дискуссию "в общем". без конкретики, только с пере постами одного и того же кода, по сути, с игнорированием всех данных советов.
единственное объяснение вижу, разбираться ты не хочешь, код этот твой просто видимость "процесса" в ожидании когда кто нибудь сделает и запостит "как надо". как бы для объяснения "на пальцах".
← →
Разведка (2012-09-09 16:04) [166]
> sniknik © (09.09.12 15:41) [162]
Я вот пока не понимаю как создать индекс на FireBird на текстовом поле, и как его в дальнейшем использовать что бы увеличилась производительность?
Ведь не параметры тормозят, это очевидно же, а скорость падает от того что в базе увеличивается количество записей, и при каждом цикле идет поиск новой записи вот и тормоза.
> Sha © (09.09.12 15:45) [164]
> Т.е. ты получишь словарь и неполный, и тяжелый одновременно.
>
Ой... лучше не думайте об этом, а то дурные мысли в голову придут.
А кому в голову мысль придет добавлять пароль мамапапажабацап124 в готовый словарь для брута. Такая идея заставить пользователей использовать пароли не засвеченные в словарях для брута, т.е. Можете брутить всеми словарями но пароль не подберете.
2. Я приобретаю опыт в программировании и по разработке.
3. На ту "кафу" куда я поступил ПКС это пригодится. Ну а чем там еще занимаются?
← →
Разведка (2012-09-09 16:06) [167]
> sniknik © (09.09.12 15:48) [165]
Угу, да виноват, виноват полностью признаю свою вину.
← →
sniknik © (2012-09-09 16:30) [168]> как создать индекс на FireBird
запрос на создание индекса почти везде одинаковый. варьируются частности, можно в доке посмотреть что.
и смотреть придется тебе... никому больше это не нужно, а работа должна быть проделана та же, кем угодно.
ну, если только кто наизусть помнит...
← →
Плохиш © (2012-09-09 16:45) [169]
> Разведка (09.09.12 16:04) [166]
> Ведь не параметры тормозят, это очевидно же
Тормозит так же не в последюю очередь разбор в каждом проходе цикла твоих одинаковых запросов. О б этом тебе и толдычат уже долгое время. Присваивай запрос до цикла, а в цикле обновляй только параметр. В противном случае теряется весь смысл использования параметров.
← →
Разведка (2012-09-09 19:52) [170]
> Плохиш © (09.09.12 16:45) [169]
Теперь дошло. Щас исправлю.
← →
Разведка (2012-09-09 21:27) [171]
> Плохиш © (09.09.12 16:45) [169]
Сделал ка ты говорил, вообще перестало работать, сдается вы лоботрясы и фигню порите лиж бы чего-будь советовать, всегда можно обвинить того у кого ничего не получается. Тут принцип рулит иди туда не зная куда, делай то не зная что, а если не получается ну ты сам дурак, мы же так тебя не учили. Оно и понятно вы и сами не знаете нихрена.
Страницы: 1 2 3 4 5 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.96 MB
Время: 0.108 c