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

Вниз

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

 
Разведка   (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 на ADOQuery

       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;


Скорость та же ничего не изменилось, и постепенно идет к уменьшению


 
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;
Скачать: CL | DM;

Наверх




Память: 0.97 MB
Время: 0.113 c
15-1345901388
Фокс Йожин
2012-08-25 17:29
2013.03.22
Картина


15-1346099401
Юрий
2012-08-28 00:30
2013.03.22
С днем рождения ! 28 августа 2012 вторник


2-1331584288
advise
2012-03-13 00:31
2013.03.22
Посоветуйте плз как разбить AVI файл на кадры?


2-1336118119
igorium
2012-05-04 11:55
2013.03.22
Как открыть папку в проводнике (вид - эскиз)


15-1340372291
БарЛог
2012-06-22 17:38
2013.03.22
Почему вода из шланга течет