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

Наверх





Память: 0.96 MB
Время: 0.065 c
2-1330496040
Cobalt
2012-02-29 10:14
2013.03.22
Char в D2010


15-1342284725
ПЛОВ
2012-07-14 20:52
2013.03.22
Некорректная работа StringReplace, или я туплю?


15-1344504943
brother
2012-08-09 13:35
2013.03.22
верстка div ом


2-1346616136
ankazh
2012-09-03 00:02
2013.03.22
Сводная таблица


15-1340630910
Ханунад
2012-06-25 17:28
2013.03.22
Возможно ли создать два фрейма?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский