Чтение и запись данных их очень большого файла

12 3
R
На сайте с 17.11.2011
Offline
22
2070

Есть один файл, уже довольно большой

В нем лежат один за другим много мелких файлов.

Структура типа

filename::filedata::0000323::1245635482

filename2::filedata2::0001323::1245635682

filename3::filedata3::0001323::1245635682

1-й - имя файла. 2-й - сам файл, 3-й количество скачиваний, 4-й - time() последнего скачивания

До этого файл считывался в массив, где в цикле находился нужный файл, строка разбивалась на еще один массив, нужные элементы массива менялись, потом строка-массив склеивалась опять в строку и весь массив склеивался обратно в файл и записывался поверх.

Бывает такое, что в одном треде идет обновление сразу нескольких позиций, поэтому цикл нахождения файла повторяется несколько раз.

Возникла необходимость и память поберечь, и быстрее все делать. Файл может вырасти до гига, а может и больше, а в одном запросе может быть доведется обновлять не один-три, а сто-триста позиций.

Что посоветует уважаемая общественность для решения этой проблемы?

домашняя страница - google.com.ua
Dreammaker
На сайте с 20.04.2006
Offline
569
#1
rommer:
Что посоветует уважаемая общественность для решения этой проблемы?

потратить пару часов и разобраться наконец-то с MySQL.

R
На сайте с 17.11.2011
Offline
22
#2

MySQL умрет.

Надо напрямую в файл.

C
На сайте с 20.05.2011
Offline
14
#3

хм, думаю, вы ошибаетесь )

переходите на БД, они именно для этого и существуют, что б гиговые файлы целиков в память не читать, с последующим построением ассоциативных массивов )

То есть, конвертируйте ваш файл в БД, и дальше работайте уже с ней.

D1
На сайте с 07.10.2008
Offline
44
#4

это кто сказал что умрет? 48млн записей и пока еще база живая, поиск долгий правда но терпимо

R
На сайте с 17.11.2011
Offline
22
#5

Тема называется "Чтение и запись данных из очень большого файла".

и помощь ожидается именно по этой теме, а придумывать велосепед может будете где-то в другой?

Не хотел вдаваться в нюансы, но:

1. в первую очередь основное ограничение, что скрипт этот пишется под разных пользователей, и надо чтобы они не возились с его установкой.

2. было сказано, что размер файл будет больше гига. Предлагаете все это хранить в таблице mysql?

3. Возможно, будут сайты, на которых нету mysql, поэтолму надо обойтись файловой системой.

rommer добавил 17.12.2011 в 02:33

да, если кто думает, что ТС незнаком с mysql запросами типа "select & update" то они сильно ошибаются. =))

rommer добавил 17.12.2011 в 03:32

Еще один нюанс для любителей изобретать велосипеды:

таких файлов может быть от одного до безконечности.

Поэтому майэскьюэльный велик отпадает =))

Dreammaker
На сайте с 20.04.2006
Offline
569
#6

Не устаю постить эту притчу или как это назвать на серч :)

Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
Новичок: Чем мне нравиться этот форум - из двух ответов ниодного конкретного. Одни вопросы неподелу!
Старожил: Не нравится - тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
Новичок: Не знаите - лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ!!!
Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю!!! А от вас нормального ответа недождёшся!!!
Прохожий: Самое крепкое дерево - дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
Новичок: Спасибо, братан! То что нужно!!!
Anamnado
На сайте с 08.02.2010
Offline
242
#7

Dreammaker, старожилы качают новую инфо фильтруют и качественную трансферят в бабос при помощи своих аццских машинок... потому и так - отвечать или не отвечать на "коварные" вопросы это личное дело каждого, но ворчат и ругаются на такое только неопытные юзеря.

rommer, конвертите ваш текстовый файл в Базу данных будет легче. но если считаете что БД умрут то можно перевести текстовую информацию в машинный код и написать свой драйвер для его обработки и преобразования в нужный для вас вид.

R
На сайте с 17.11.2011
Offline
22
#8

Вы, двое, вижу, нихрена не читатели, а исключительно писатели.

Повторяю:

1. в первую очередь основное ограничение, что скрипт этот пишется под разных пользователей, и надо чтобы они не возились с его установкой.

2. было сказано, что размер файл будет больше гига. Предлагаете все это хранить в таблице mysql?

3. Возможно, будут сайты, на которых нету mysql, поэтолму надо обойтись файловой системой.

4. таких файлов может быть от одного до безконечности.

Anamnado
На сайте с 08.02.2010
Offline
242
#9
rommer:
Вы, двое, вижу, нихрена не читатели, а исключительно писатели.
Повторяю:
Предлагаете все это хранить в таблице mysql?

1 оракл........

2 разбить файл на несколько.... (по алфавиту, по начальным буквам по велечине идентификатора, да как угодно) в зависимости от того как у вас идет выборка

>> 1. база данных РЕЛЯЦИОННАЯ - легко решает вашу проблему. (и mysql в том числе и размер файла тут непричем - всё зависит как вы будете хранить информацию в БД - как разнесете по таблицам, а не тупо все засунете в одну [таблицу] что действительно в данном случае не имеет смысла как таковое)

читайте. [про "реляционную бд mysql"]

filename::filedata::0000323::1245635482

filename2::filedata2::0001323::1245635682

filename3::filedata3::0001323::1245635682

позиция 3 и 4 (повторяющиеся)- это называется в БД "избыточность данных", которая создают лишнюю громоздкость файлу, эту проблему вы легко решите в БД если научитесь правильно разрабатывать структуру. я понимаю что у вас это всего лишь пример но я и не знаю реальной инфо.

да mysql вполне сойдет.

R
На сайте с 17.11.2011
Offline
22
#10

еще раз: задачу надо решить без базы и прочих довесков до пхп.

что скрипт этот пишется под разных пользователей, и надо чтобы они не возились с его установкой.

Anamnado:
азбить файл на несколько

Разбить на начальные буквы, это уже на что-то похоже, в смысле "по теме" :D

Но тут один нюанс: если так, то прийдется либо считать все файлы в память, либо постоянно шуршать по всем файлам.

У меня возникла следующая идейка:

к примеру если нужно скачать filename2, то скрипт читает шматками файл, пока не находит то что надо скачать. По мере поиска, встречая остальные файлы, они заносятся в отдельный массив, типа $filearr[]=filename1; $filearrPos[]=позиция_filename1_в_файле();

Соотв. если надо скачать след. файл, то если он уже есть в массиве, то установить указатель и прочесть и записать инфу, а если нет, то продолжить чтение шматками основного файла.

Что кто скажет?

Оговорюсь: вопрос скорее философский, если кто рубит.

Так что велосипедистов с их базами данных настойчивая просьба не беспокоить. :D

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий