Помогите как это делаеться не могу сообразить не как. Может есть какие то более гуманные способы работы с большим объемом строчных данных, важна скорость обработки и чтоб срвак не нагружало сильно.
Спустя 21 минута, 54 секунды (10.09.2010 - 22:44) Nord написал(а):
Цитата |
Требуется загрузить файл с данными в массив и хранить его в озу, причина более 1млн строк в файле |
Это скорее причина НЕ хранить этот файл в озу
Цитата |
задача работа с этими данными - поиск даблов при загрузке новых строк. |
Можно по подробнее, какого рода эти строки
Почему база данных не годится?
Спустя 10 минут, 59 секунд (10.09.2010 - 22:55) sx000 написал(а):
Строки это ардеса сайтов
site.com/ins.html
site.com/ins2.html
site.com/ins3.html
и так больше миллиона ... естественно абсолютно разные страницы.
сайты бдут добавляться в данный массив в секунду десятками использую лок, при этом будет идти сравнение есть ли такая строка уже в этом массиве или нет, а также будет идти выборка и пометки на предмет были ли совершены дествия с строкой или нет.
site.com/ins.html
site.com/ins2.html
site.com/ins3.html
и так больше миллиона ... естественно абсолютно разные страницы.
сайты бдут добавляться в данный массив в секунду десятками использую лок, при этом будет идти сравнение есть ли такая строка уже в этом массиве или нет, а также будет идти выборка и пометки на предмет были ли совершены дествия с строкой или нет.
Спустя 1 минута, 24 секунды (10.09.2010 - 22:56) sx000 написал(а):
база не годиться потому что когда в ней будет более 1 млн данных я ее просто убью своими не грамотными запросам, тк не умею с ней работать на достаточно проф. уровне чтоб не нагружать сервер.
Спустя 22 минуты, 27 секунд (10.09.2010 - 23:19) ApuktaChehov написал(а):
Цитата (sx000 @ 10.09.2010 - 22:56) |
база не годиться потому что когда в ней будет более 1 млн данных я ее просто убью своими не грамотными запросам, тк не умею с ней работать на достаточно проф. уровне чтоб не нагружать сервер. |
Тогда держите записи на бумаге, так как в файле, учитывая ваш недостаточно профессиональный уровень, хранить такое дело очень опасно.
Такое большое кол-во данных НУЖНО хранить в БД. Не умеете - учитесь.
Спустя 23 минуты, 12 секунд (10.09.2010 - 23:42) sx000 написал(а):
возможно вы правы, но как вы считаете если я буду каждую секунду в 10 потоков дергать MYSQL на предмет выборки из массива 1мл и больше что с ним будет? Рационально ли будет расходоваться ресурсы сервера при этом, я же пишу что это задача очень важная как ресурсы. Конечно туда в базу можно запихать и 33млн строк все зависит того насоколько вы готовы уранить свой сервер при этом в производительности. Данные постоянно меняются в этом массиве в сторону увиличения, если бы была статика то я бы подумал на счет какой то грамотной индексациия но при таком динамично раскладе я думаю это не совсем коректно.
Спустя 26 минут, 22 секунды (11.09.2010 - 00:08) FatCat написал(а):
Цитата (sx000 @ 11.09.2010 - 00:42) |
если я буду каждую секунду в 10 потоков дергать MYSQL на предмет выборки из массива 1мл и больше что с ним будет? |
1. Делаете таблицу трехбуквенных сочетаний. Айдишник по инкременту.
2. В таблицу миллиона строк добавляете поле цифровое индексированное идентификатора первых трех букв строки.
Молотите час или сколько понадобится, чтобы в таблице с миллионом строк просчитались и записались айдишники вариантов трех букв.
3. При поиске делаете 2 запроса. Сначала запрос к таблице трехбуквенников по первым трем буквам искомой строки, получаете айдишник этого трехбуквенника. Вторым запросом поиск нужной строки, ограничив зону поиска идентификатором.
У меня сейчас на этом принципе работает проект семантического анализа текстов, основная база к 10 миллионам строк приближается. Ничего, работает.
На 5-миллионной базе можно посмотреть в действии демо-версию: http://phpforum.ru/index.php?act=module&module=sema
Спустя 6 минут, 11 секунд (11.09.2010 - 00:15) waldicom написал(а):
Цитата (FatCat @ 10.09.2010 - 23:08) |
1. Делаете таблицу трехбуквенных сочетаний. Айдишник по инкременту. |
немного не ясно - как будут составляться/выглядеть эти трехбуквенные сочетания
Спустя 26 минут, 59 секунд (11.09.2010 - 00:42) sx000 написал(а):
Согласен, но я же говорю что база растет постоянно 1млн через 24 часа превратиться в 2млн ... она динамичная же. Искаться будет по вашему методу только в индексированой области та кторая новая будет пропускаться или в ней надо делать тупой поиск методом перебора ...
Спустя 6 минут, 7 секунд (11.09.2010 - 00:48) waldicom написал(а):
Вы правда думаете, что перебор в файле средствами php быстрее базы данных?
Спустя 5 минут, 53 секунды (11.09.2010 - 00:54) sx000 написал(а):
а как вы думаете, если файл будет в озу быстрее он будет перебираться? RAM диск только не предлагайте нет возможности сделать.
Спустя 4 минуты, 34 секунды (11.09.2010 - 00:58) waldicom написал(а):
Цитата (sx000 @ 10.09.2010 - 23:54) |
а как вы думаете, если файл будет в озу быстрее он будет перебираться? RAM диск только не предлагайте нет возможности сделать. |
Думаю, что если Вы хотите запихать файл с 24 млн строками в озу, то php вежливо сообщит Вам, что это не есть хорошо
Спустя 4 минуты, 49 секунд (11.09.2010 - 01:03) FatCat написал(а):
Цитата (sx000 @ 11.09.2010 - 01:42) |
Искаться будет по вашему методу только в индексированой области |
Почему?
Первый раз проиндексируете, а дальше при вводе новой строки сразу берете первые 3 буквы, запросом по базе трехбуквенников получаете айдишник, и записываете новую строку уже с айдишником. Тогда искаться будет всегда по всей базе.
А текстовый поиск по многомиллионной базе будет тормозить так, что не дай бог.
Предложенный мной метод справится с проверкой и добавлением новой строки в несколько сотых долей секунды.
Спустя 2 минуты, 39 секунд (11.09.2010 - 01:06) sx000 написал(а):
тогда как вариант индексировать строку на входе сразу при записи пусть даже в базу или файл это уже не важно если есть индексы будет быстро работать тем более по градации трех символов
Спустя 1 минута, 11 секунд (11.09.2010 - 01:07) sx000 написал(а):
толсты кот ты меня опередил я писал тоже самое, спасибо за логику
Спустя 9 часов, 5 минут, 53 секунды (11.09.2010 - 10:13) Nord написал(а):
Хочу добавить:
Цитата |
2. В таблицу миллиона строк добавляете поле цифровое индексированное идентификатора первых трех букв строки. Молотите час или сколько понадобится, чтобы в таблице с миллионом строк просчитались и записались айдишники вариантов трех букв. 3. При поиске делаете 2 запроса. Сначала запрос к таблице трехбуквенников по первым трем буквам искомой строки, получаете айдишник этого трехбуквенника. Вторым запросом поиск нужной строки, ограничив зону поиска идентификатором. |
Идентификатор первых трех букв это получается аналог хеша
Его можно генерировать и без второй таблицы:
1) Самый простой способ: сложить все символы строки и взять остаток от деления на какое-то большое число:
function hash($string){
$len = strlen($string);
$hash = 0;
for ($i = 0; $i < $len; $i++) $hash += ord($string[$i]);
return $hash % K; // K - кол-во групп. Для большой базы число должно быть большим
}
// На выходе получается число от 0 до K - 1 - идентификатор группы строк
2) Можно в принципе генерировать те же трех-буквенный id-шники так:
function hash2($string){
return (ord(@$string[2]) << 16) | (ord(@$string[1]) << 8) | ord(@$string[0]);
}
// Для строки 'sad' ("\x73\x61\x64")
// hash2: 6578547 (0x646173) - идентификатор группы строк
Спустя 6 часов, 3 минуты, 3 секунды (11.09.2010 - 16:16) sx000 написал(а):
слушайте может в мускуле есть уже встроенная система индексирования? Которая по сути выполняет те е самые функции, мод велосипед тут изобретаем?
Спустя 19 минут, 40 секунд (11.09.2010 - 16:35) waldicom написал(а):
Цитата (sx000 @ 11.09.2010 - 15:16) |
слушайте может в мускуле есть уже встроенная система индексирования? Которая по сути выполняет те е самые функции, мод велосипед тут изобретаем? |
Возможно странный вопрос, но вы спрашиваете, есть ли в mysql индексы?
Если да, то да
Спустя 1 час, 26 минут, 43 секунды (11.09.2010 - 18:02) FatCat написал(а):
Полнотекстовые индексы помогают быстро находить строки в текстовых полях.
Но если я правильно понял, нужно еще и писать в эту таблицу...
Добавление новой строки требует перестройки индекса, и добавление одной новой строки на миллионной базе будет занимать несколько секунд.
На 10-миллионной базе добавление новой строки будет занимать несколько минут, а может и часов...
Но если я правильно понял, нужно еще и писать в эту таблицу...
Добавление новой строки требует перестройки индекса, и добавление одной новой строки на миллионной базе будет занимать несколько секунд.
На 10-миллионной базе добавление новой строки будет занимать несколько минут, а может и часов...