Алгоритм работы с большим файлом базы данных

Статус
В этой теме нельзя размещать новые ответы.

vovanium

Новичок
вовоняем, ты топик-то читал?
В отличии от тебя читал... Какая-то у тебя прям фобия работы с файлами

Челу нужно выбрать определенные строки из текстового файла, по номерам, номера могут быть в случайной последовательности и количестве. Мой пример показывает как выбрать случайную строку, думаю как этот код оформить в виде функции и вместо rand подставлять нужный номер строки, можно догадаться?
А ты тут предлагаешь ему изучить MySQL (учитывая что он не особо его знает судя по всему), перекинуть все эти 20 гиг в MySQL, переделать скрипты на работу с БД и в итоге получить более низкую производительность...
 

dimagolov

Новичок
vovanium, читал это не значит Прочитал и понял. Я типизированный индекс уже советовал.
 

vovanium

Новичок
dimagolov
Я типизированный индекс уже советовал.
Первое же твое сообщение "познай базы", и дальше начинаете 3 страницы обсуждать всякую фигню, включая плюсы/минусы/настройки ОС. Да аж на третьей страницы ты сказал про индексный файл типизированный, но ТС либо пропустил, либо не понял и вы продолжили обсуждать ОС, вместо того чтобы настоять на правильном ответе...
 

dimagolov

Новичок
vovanium, фигней на самом деле страдает ТС, а теперь и ты, так как обсуждение идет про сферического коня в вакууме. более того, задачу в том виде, как ее ставит ТС очень может быть решать вообще не нужно, уж больно странно выглядит желание случайно (или в каком-то особом порядке) сортировать миллион строк.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да, ты прав, это - сортировка по неопределенному алгоритму (по сути - неопределенная задача)
 

vovanium

Новичок
dimagolov
Что-то вас на философию летом тянет. У ТС есть конкретная задача уже работающая, заметь он просит помочь с оптимизацией работающей задачи, а не какой вымышленной. У него уже есть 20 гиг текста. А ты тут про коней рассуждаешь, и том что его задача плохая...
 

dimagolov

Новичок
vovanium, ты хочешь что любой код, который уже работает является необходимым? в процессе развития системы и изменения требований к ней регулярно выясняется, что что-то делать не нужно или нужно, но совсем по-другому. так и тут, можно нателепатить, что пока речь шла про 1000 строк, то такое решение было адекватным, но когда их кол-во выросло на 3 порядка, то масштабировать существующее решение нельзя никак, можно только найти другое решение проблемы.
 

dimagradov

Новичок
Ребята, только не ругаться!
Идею, с индексным файлом я понял) и приму к сведению спасибо, но мне кажется, что основную проблему не решит.
vovanium Правильно сказал, что у меня уже есть алгоритм давно работающий. И главное правильно, что я этот текстовый файл изменять совершенно не собираюсь.
dimagolov правильно сказал, что как бы я не оптимизировал индексный файл, из-за того, что мне нужно отсортировать миллион строк всегда будет тяжелой задачей.

Как мне кажется основная проблема в том, что пример такого кода и есть главные тормоза в моей задаче, это когда нужно строку выдать близкую к началу файла, а потом строку в конце, потом в середине и т.д.
PHP:
fseek($fm, 10000000);
fseek($fm, 110);
fseek($fm, 20000000);
fseek($fm, 40000000);
Если бы я загнал все в оперативку, то все бы выдавалось намного быстрее, но оперативки не хватает.
 

vovanium

Новичок
dimagolov
Всему свое время, для этого ТС должен созреть сам. А не начинать менять всё и делать всё с нуля, только потому, что ему об этом сказали люди даже не знающие задачи целиком. На это как минимум нужно время, и я считаю, что если есть возможность в сотню или даже тысячу раз ускорить работающий код, дописав десяток строчек, то это нужно сделать. И пусть себе работает, а время которое до этого тратилось на разборки с хостером по поводу перегрузки сервака, можно будет потратить на переосмысливание проекта...
 

dimagolov

Новичок
Как мне кажется основная проблема в том
на профайлинг тебе уже намекали. теперь скажу прямо. берешь microtime и смотришь (пишешь в лог) какой кусок сколько времени выполняется. в циклах считаешь среднее время исполнение определенного кол-ва итераций (подбирается экспериментально, чтобы не засирало лог слишком быстро и было информативно). как сделаешь, то гадать не придется на что уходит время.
нужно строку выдать близкую к началу файла, а потом строку в конце, потом в середине и т.д.
открой в конце концов тайну, зачем такой закат солнца вручную?
 

vovanium

Новичок
dimagradov
Если бы я загнал все в оперативку, то все бы выдавалось намного быстрее, но оперативки не хватает
Ты не понимаешь что смещение по файлу, выполняется на порядки быстрее чем чтение всего файла (тем более с помощью fgets). Точно также если ты тупо загонишь все в память, не факт что оно будет работать быстрее (зависит от того как именно загонишь и будешь использовать), т.к. при больших строках php начинает очень сильно тормозить, даже есть у тебя памяти хватит на все 2 гига. В любом случае нужен индексный файл, чтобы не искать строки по большому файлу.

Что касается сортировки, как именно ты сортируешь?
 

dimagradov

Новичок
Автор оригинала: tf
вот и хорошо, вперед, сюда то зачем пришел?
Ты не понял, vovanium правильно сказал, что mysql хороша, когда нужно будет менять определенные ячейки в БД, у меня текстовый файл не изменнный, главное вытащить из него нужные строки, в нужный момент.

-~{}~ 07.08.09 01:46:

dimagolov и vovanium если вам что-то это говорит, то это дорген. Есть текст, нужно случайным образом из 2-х гигового файла выбрать неповторяющихся 200-400 строк. С помощью них формируется html страница, таких страниц нужно тысячу. Поэтому, чтобы создать сайт нужно 400*1000= 400 000 строк. И именно поэтому точно сказать сколько мне нужно строчек для одного сайта я не могу.
 

dimagolov

Новичок
Как много в жизни, я все-таки не знаю ;)
http://tinyurl.com/mtyafw:
Дорвеи относятся к так называемому Black SEO («черной оптимизации»), и поэтому автоматически и вручную исключаются из индексов поисковых систем, как сайты не имеющие никакой смысловой нагрузки для «живых» пользователей, а использумые исключительно для обмана поисковых ботов и, в большинстве случаев, для извлечения прибыли.
ИМХО при такой постановке задачи БД должна оказаться предпочтительней, так как будет кешировать результаты выборки да и брать на себя оптимизацию работы с диском. так что производительность можно будет тюнить настройками БД при неизменном запросе и алгоритме.
я бы строил временную таблицу (можно даже в памяти, Storage Engine MEMORY) со случайными номерами строк (причем с уникальным ключем, то есть при повторе insert просто вернет ошибку), а потом join-ил полученное с исходной таблицей строк.
 

dimagradov

Новичок
БД не будет предпочтительнее, Т.к. на сервере я просто делаю html страницы, а потом они заливаются совершенно в другое место.
 

korchasa

LIMB infected
Автор оригинала: dimagradov
БД не будет предпочтительнее, Т.к. на сервере я просто делаю html страницы, а потом они заливаются совершенно в другое место.
То, что ты делаешь и есть БД. Возьми какую-нибудь из готовых key/value штук. Если, конечно, тебе не хочется все сделать самому :D

-~{}~ 07.08.09 02:43:

Если все таки хочешь сам, то скажи хотя бы как происходит запись и чтение. Ну, например:
- запись большими кусками, раз в пол часа
- чтение произвольное, повторяются 10% запросов
 

SiMM

Новичок
> ИМХО при такой постановке задачи БД должна оказаться предпочтительней
ИМХО при такой постановке задачи топикстартеру вообще нечего делать в клубе.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху