Кто марафон ты марафон епт

Почему-то всегда дико угорал от марафонов различных блоггеров (типа le secret с его инфинити), но посмотрев на стату последней пачки в тизернете с 300рублями дейли, подумал что я сам не сильно далеко ушел.

Теперь по сути: страницы медленно, но верно лезут в индекс (кстати, чем чекать гуглоиндекс на тысячах/десятках тысяч доменов?), трафик еле-еле растет. Тыщ 7 вроде сейчас, учитывая что залезло максимум по 100 страниц с домена.
Вроде все по плану, но на быстрый результат надеяться не приходится.

Теперь о технических моментах: отказался от вп, отказался от статики (прошлая пачка на 8кк страниц до сих пор ставит раком фс на сервере при любой попытке ее потрогать), переехал на это чудо. Правда, подозреваю, что оно дырявое.
Написал простейший скрипт для импорта данных напрямую в sqlite базу, и все было бы хорошо, пока не уперся в один момент: в упор не могу придумать, как БЫСТРО брать n рандомных строк из большого файла.
Что оказалось быстрее всего на тестах из всех вариантов, которые я смог придумать или нагуглить:

тратит около 15 секунд на выдергивание 4к строк из 500мб файла. А файлов — две штуки.
И эта хуйня тормозит мне весь процесс — в итоге на создание вхоста + генерацию дора на 4к страниц (1 саб) уходит аж 1 минута. Получается всего около 4-5кк в сутки, что меня очень расстраивает.
Может сюда забредет какой-то опытный и гениальный кодер, который предложит более быстрое решение?

Alik
21 ноября 2013г. в 22:35

Ну ты сегодня обрадовал. 3 поста целых.
с 7к всего 300р выходит?
почему тизернет? а не бодиклик?
Не знаю, будет ли быстрее, но посмотри на pthreads php(http://pthreads.org/). Достаточно интересная штука.

x
22 ноября 2013г. в 05:52

да, примерно 300р с 7к. вап пока не сливаю, его вроде особо некуда.
еще уперся в сложность контроля за трафиком (по дурости на каждый дор регнул отдельный счетчик, но информацию с них еще можно относительно быстро получать и суммировать) и индексацией (просто не знаю чем такие объемы в гугле чекать быстро).

не совсем понял как мне поможет pthreads для решения моей задачи. как писал выше — уперся в скорость дергания рандомных строк из большого файла, тормозят даже awk и sed, написанные на си.
и распараллеллить помоему тут не получится — грузятся все ядра процессора.

не бодиклик, потому что при всем уважении к нему, там конверт говно.

F17
22 ноября 2013г. в 00:43

Я не опытный и гениальный кодер, но в аналогичной задаче сделал с другой стороны: файл ОДИН раз перемешал, а потом строки брал подряд. Использованные строки переносил в другой файл, на всякий случай. Как основной файл кончился — менял их местами, перемешал и вперед опять.

x
22 ноября 2013г. в 05:57

хм. изначально так и хотел сделать, но потом подумал что т.к. кеев мало (адалта всего 10 лямов), то это будет бессмысленно.

а сейчас так смотрю — впринципе с моими текущими 4-5 миллионами страниц в день одного перемешивания файла хватит на пару суток.

спасибо!

profitnull
23 ноября 2013г. в 14:11

> пока не уперся в один момент: в упор не могу придумать, как БЫСТРО брать n рандомных строк из большого файла

Набросал тебе скрипт быстрой выборки уникальных строк из файла, работает через генерацию индексного файла, для кеев индекс весит подряка 10-15% от исходного.

Выборка 4к строк — 50-60 мсек на hdd у меня.

Нужно один раз сгенерить индекс BuildIndex, затем можно делать выборки. Для 3гб (140 млн. кеев) индекс создается минут 10. Больше 4гб файл не схавает, надо разбивать.

http://paste.org.ru/?qvurea

x
23 ноября 2013г. в 14:16

клевый ник и мыло.
спасибо, посмотрю. а почему больше 4гб файл не схавает?

profitnull
23 ноября 2013г. в 14:22

Упаковка http://us2.php.net/pack интового беззнакового — взял независимый от разрядности системы N unsigned long (always 32 bit, big endian byte order), влом разбираться честно говоря, как там с 64 оно пакуется

aloha
23 ноября 2013г. в 15:27

>>кстати, чем чекать гуглоиндекс на тысячах/десятках тысяч доменов?
Попробуй http://checkparams.com/ru, только прокси нужны норм для индекса большого числа доменов. 10к доменов за час отчекает.

А li этим скриптиком можно массово чекакать http://statli.ru/

x
23 ноября 2013г. в 15:30

да ну, чекпарамс виндовый. прокси покупать только ради гугла не охота, были б прокси я бы и без чекпарамса прочекал 🙂
а ли я так например чекаю https://codeo.me/1P1

profitnull
27 ноября 2013г. в 20:11

Как успехи на пути к млрд.?

x
28 ноября 2013г. в 10:06

все ок, еще доменов возьму сегодня

Zoo
23 февраля 2014г. в 07:46

Ты говоришь, что статика ставит систему раком.

Я разбиваю файлы на папки, стат сайты работают нормально.
Но мне легче, я беру данные из базы с контентом, где есть дата, то есть просто бью страницы на папки годов, затем месяцев, затем дней. В итоге в 1 дне получается приемлемое количество файлов, меньше сотни.

x
23 февраля 2014г. в 18:51

Бекапить или переносить все равно неудобно, так что я все-таки остановился на sqlite.
Но твой способ, само собой, тоже хороший.

lorien
26 апреля 2014г. в 20:02

Чтобы быстро брать рэндомные строки из файла тебе нужно построить дополнительный файл индекс в котором будут перечислены смещения всех строк. Собственно, это одна из базовых вещей, которые решают mysql, postgres и т.д. — строят индексы для быстрого доступа. Теперь представь, у тебя есть файл со всеми смещениями, читаешь этот индекс-файл в память, берёшь рэндомное смещение (+ смещение следующей записи). Теперь открываешь файл со строками как бинарные файл и делаешь seek операцию, далее читаешь сколько надо байт (определишь по смещению следующей записи). Если индекс-файл в свою очередь слишком большой получится для RAM, то достаточно для каждого смещения выделять одинаковое кол-во байт. Теперь зная кол-во смещений, просто генерим рэндомное число, открываем индекс-файл как бинарный файл, вычисляем откуда читать (кол-во байт для смещения * на число), читаем смещение и далее см. выше.

x
27 апреля 2014г. в 04:23

Спасибо за клевый коммент, но это все жуткий оверхед для таких зада

profitnull
27 апреля 2014г. в 09:20

Реализовано парой комментов выше, гг

lorien
27 апреля 2014г. в 09:22

> Реализовано парой комментов выше, гг

Упс, точно. Не заметил 🙂

Оставить комментарий

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой:

Яндекс.Метрика