[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массив данных в ОЗУ
sx000
Требуется загрузить файл с данными в массив и хранить его в озу, причина более 1млн строк в файле, задача работа с этими данными - поиск даблов при загрузке новых строк.
Помогите как это делаеться не могу сообразить не как. Может есть какие то более гуманные способы работы с большим объемом строчных данных, важна скорость обработки и чтоб срвак не нагружало сильно.



Спустя 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
и так больше миллиона ... естественно абсолютно разные страницы.
сайты бдут добавляться в данный массив в секунду десятками использую лок, при этом будет идти сравнение есть ли такая строка уже в этом массиве или нет, а также будет идти выборка и пометки на предмет были ли совершены дествия с строкой или нет.

Спустя 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 написал(а):
толсты кот ты меня опередил smile.gif я писал тоже самое, спасибо за логику

Спустя 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-миллионной базе добавление новой строки будет занимать несколько минут, а может и часов...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.