- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Как удалить плохие SEO-ссылки и очистить ссылочную массу сайта
Применяем отклонение ссылок
Сервис Rookee
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть большой массив, примерно 640.000 строк, если в файле, то 15Мб информации.
Как работать с таким массивом не перегружая сервер? В основном надо рандомно выбирать данные из него, порядка 2.000 строк за раз, при этом удаляя то, что было выбрано, т.е. уменьшая сам массив.
humbert,
при всей моей нелюбви, должен сказать, что здесь, как-раз, задача для мускула. Файл перегнать в БД и пользовать.
Если есть желание остаться с файлом, то не мудрить, а читать файл построчно, одновременно записывая новый (без удаленных строк). Работать будет чуть медленнее, но зато не перегружая сервак.
Загнать этот массив в mysql базу.
Проблема в том, что таких массивов может быть и 100 и 1000
P.s. в мускул загонял, вес одного массива 20мб в таблице.
в мускул загонял, вес одного массива 20мб в таблице.
Критичен размер базы?
На самом деле есть потеря в дисковом пространстве при размещении подобной информации в базе.
Но при работе с массивами вы сталкиваетесь с некоторыми сложностями, а именно:
- во первых этой громадиной в памяти работать не совсем удобно.
- быстрое удаление из массива в php при таких размерах становится достаточно нетривиальной задачей.
Так что смотрите все-таки в сторону БД. Я обрабатываю таблицы с количеством записей в 4-5 млн. (основная операция - выборка случайных строк из таблицы). При желании можно воспользоваться стандартной функцией MySQL - rand (ORDER BY RAND). Ну или по старинке, ручками по id-шникам.
Пы.Сы. Текст перемешиваешь , да ? ;-)
humbert, я бы прошелся по файлу и "заметил" начала строк и их длину, создал индексный файл, он бы получился под 100кб отсилы я думаю и юзал его для своих задач. открыть файл, оффсетнуть в место и считать пусть даже 5000 байт - милисекунды, при этом не надо насиловать бд, память, проц, файловую систему.
по похожему принципу работает моя одна штучка - гео бибилотека, так у нее скорость разрешения страны для IP - 40 000 ip в СЕКУНДУ на моем ноутбуке. ни один мускуль сервер столько не сделает, поверьте ;) проверял, даже рядом не стоит.
когда я ее написал, была самая быстрая библиотека на питоне (или перле, точно не помню), там была скорость 5000 в секунду)
Так что смотрите все-таки в сторону БД. Я обрабатываю таблицы с количеством записей в 4-5 млн. (основная операция - выборка случайных строк из таблицы). При желании можно воспользоваться стандартной функцией MySQL - rand (ORDER BY RAND).
Очень странно. order by rand() жутко тормозная штука, которая при работе выбирает все записи из таблицы, потом их сортирует и часть (нужную) возвращает. Использовать ее при большом количестве записей это садизм. А Вы при4-5млн записей ее используете?
Есть большой массив, примерно 640.000 строк, если в файле, то 15Мб информации.
Как работать с таким массивом не перегружая сервер? В основном надо рандомно выбирать данные из него, порядка 2.000 строк за раз, при этом удаляя то, что было выбрано, т.е. уменьшая сам массив.
1) Если строки ограниченного и небольшого размера, то можно упорядочить структуру, конвертнуть файл в файл со строками одного размера и с ними работать.
2) Загнать все-таки в базу. Неужели так велика разница между 15Мб в файлах и 20Мб в базе? Если еще важна скорость, то memory table могут неслабо помочь.
3) Вариант 2, только в sqllite загнать, что бы с мускулом не городить и с файлами по сути работать.
4) Можно сделать как предложил bearmen, его вариант это по сути создание своей простой БД, единственное преимущество которого в простоте. Но для простоты опять же годится sqllite
Очень странно. order by rand() жутко тормозная штука, которая при работе выбирает все записи из таблицы, потом их сортирует и часть (нужную) возвращает. Использовать ее при большом количестве записей это садизм. А Вы при4-5млн записей ее используете?
тоже заметил да не стал коментировать)
причем сортировка (всегда? вопрос к edogs. я не знаю метода сортировать по рандому без темп тейбла и order by rand(), когда приходится - ухищряюсь через селфжойн айди таблички сортированой, при больших таблицах конечно заметно, но всеже не order * by rand ))) чере темп тейбл
bearman, спасибо, об этом думал уже (индексный файл). Пока остановился на другом решении, применил БД.
humbert, ну я ваших затей не знаю )))
может вам миллион хитов в час надо :D тогда такой метод имеет право на жизнь )))))))
причем сортировка (всегда? вопрос к edogs. я не знаю метода сортировать по рандому без темп тейбла и order by rand(), когда приходится - ухищряюсь через селфжойн айди таблички сортированой, при больших таблицах конечно заметно, но всеже не order * by rand ))) чере темп тейбл
Зависит от кол-ва нужных Вам случайных значений.
1) Если нужно немного - типа пара, то классическим способом, при не слишком дырявой базе по ИД считается (утрированно).
и так нужное количество раз
2) Если нужно побольше (допустим 200) и база чуть более дырява (допустим треть отсутствует), то опять же при не слишком дырявой БД вполне работает нечто вроде первого же способа, только сначала генерим штук 400 рандомных ИД (в php тупо mt_rand-ом например), потом делаем один запрос на выборку данных по этим ИД (select * from table where id in (1,525,252...), если недостаточно выбралось (попали много раз на дырки), то делаем еще запрос.
3) Ну и если выборки достаточно частые, а апдейты редкие + ИД достаточно дырявые, то есть смысл завести таблицу соответствий "ИД_рандом <> ИД_Реальный". Где ИД_рандом будут значениями подряд идущими. Тогда будет отдельная, быстрая, недырявая таблица для выборки случайных значений (способом 2).