![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Плиз!!!
Хелп ламаку!!! Есть файл, хранящий массив, елементы разделены пробелом, например file.dat содержит: 1 2 3 5 4 7 3 4 5 5 3 8 5 4 3 7 5 4 4 5 3 4 6 3 как измений i-й елемент в j-й строке, например елемент номер 2 в 3-й строке, т.е. четверку на 5 -------------------- SEO-мастер |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
|
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
чет я ниче не понял
мне нужно в файле изменить елемент массива, а ты че дал -------------------- SEO-мастер |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
PROme Я после экзамена по термообработке прЕтормаживаю
Это сообщение отредактировал(а) Secandr - 20.1.2004, 20:52 |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Secandr, спасибо, конечно за помощь, но, похоже кто-то чиго-то не понял.
Смотри топик - запись в файл. Собственно именно с этим у меня и проблемы. Поставлю вопрос проще. Как записать содержимое $bla_bla в файл в нужную строку Точнее даже не просто в нужную строку, а обновить (заменить, затереть) существующую старую Это сообщение отредактировал(а) PROme - 20.1.2004, 23:34 -------------------- SEO-мастер |
|||
|
||||
| [xoodo] |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 424 Регистрация: 9.3.2003 Репутация: 1 Всего: 4 |
Оно? |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Допустим ты хранишь все числа с одинаковой длинной, т.е. "234"," 23"," 2" - если надо дополняешь число пробелами.
Количество таких чисел в строке известно, также известно сколько символов разделяют строку. Тогда:
Не уверен в режиме открытия файла(может надо "r+"). Идея ясна - если мы знаем длинну элементов, то мы знаем сколько надо пропустить, что бы попасть в нужное место. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
PROme Лучше хранить данные в виде:
1-2-3;4-5-6; Или вообще 1-2-3-4-5-6 Так с ними работать проще. Просто переовд строки в разных ОС разный и могут быть проблемы при переносе (Unix - \n, Windows - \r\n) Гораздо лучше применять специфические разделители. |
|||
|
||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
Вообще все делается намного проще ... чет Вы тут кашу развели ... особенно Secandr со split'om это же изврат ...
делается все так:
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Iz@top В принципе идея была такая же.
А чем split хуже explode ? |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
О Боже! Терпение-терпение-терпение...
Всем, конечно, спасибо, но я спрашивал под конец уже, можно ли как-то на ПХП переписать отдельную строку в файле. Перезапись всего файла не катит из-за раааааааааазмеров файла. -------------------- SEO-мастер |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Я так и понял Ответ: организуй структуру файла так что бы было удобно перемещатся по нему. Так как ты хранишь только числа тебе не нужны заморочки с заголовками, длиннами полей и т.д. С помощью fseek перемещай указатель в нужное положение, пиши то что надо.
Можно если ты знаешь где она находится -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
так, ставлю прямой вопрос, плиз КАК заменить 3-ю строку (целиком и полностью) в файле file.txt на содержание переменной $bla_bla
-------------------- SEO-мастер |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Если файл очень большой то можно хранить смещения до строк в отдельном файле, сами строки будут заканчиваться специальной последовательностью(впрочем ты можешь также хранить и длины строк).
Ты загружаешь файл со смещениями -> находишь смещение нужной строки -> работаешь со строкой. Заметь столько гемороя нужно для работы со строками переменной длинны! Если файл небольшой то лучше использовать file()->implode()->fwrite(), но на могопоточном сервере(Апач) этого делать не стоит, т.к. можешь потерять данные. Обходной путь fopen()->flock(LOCK_EX)->explode()->implode()->fwrite(); Пример
Писал с головы так что в коде не уверен. Уже нашел недоделки: каждый раз как только ты записываешь строку меньшей длинны ты уменьшаешь максимальный размер поля =\. Выход хранить длины строк. Если строка не вмещается в середину ты записываешь ее в конец файла данных и правишь ее смещение. При удалении ты удаляешь ее смещение из файла смещений. Смещения обязанны быть все одной длинны, если надо дополняй пробелами. Время от врмени перестраиваешь весь файл данных. ИМXО гиморно это все Это сообщение отредактировал(а) Sardar - 22.1.2004, 03:12 -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Secandr |
|
||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Можно модернизировать код предложеный Sardar.
Хранить файл в виде: 001001001001001002002002002002003003003003003 который логически может быть представлен в виде:
Смысл в том, что под каждую запись отделяется по 3 байта, в каждой строке 5 записей - 15 байт, тогда:
Просто выкидываем все разделители. |
||||
|
|||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Спасибо, уже кое-что...
А что в ПХП нет стандартной функции построчной рабоиты с файлами
Нужен... Раскидать то легче, но скорость будет меньше - проверено на практике + нужно постоянно бекапить, я не представляю как бекапить БД (учитывая что бекап - прога на Дельфях, работающая на другом компе...) Жду еще ответов. Может все же можно производить построчные запись/удаление -------------------- SEO-мастер |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Secandr я уже писал что нужно чтоб все было построчно.
Представь что надо прочесть 142536-ю строку - при твоем варианте это гораздо сложнее и дольше реализовываться... хотя тоже вариант... -------------------- SEO-мастер |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
В моем примере я предложил две структуры файла:
1)файл содержащий элементы с фиксированной длиной - файл смещений 2)файл содержащий элементы с переменной длиной - файл данных Если тебе нужно хранить текст, то лучше реализовать схему смещения->данные. Иначе, если тебе не жалко дополнить строку пробелами, что бы у всех строк была одинаковая длина, лучше сделать файл с элементами с фиксированной длиной. Подход смещения->данные позволяет работать с размерами файлов в сотни мегабайт. Запись более длинной строки в середине файла невозможна, т.к. нет места. Варианты: 1)записывать строку в конец файла данных и редактировать смещение. Именно смещение отвечает за порядковый номер строки, а данные раскиданны в любом порядке по файлу данных. 2)делить строку -> очень гиморно -> очень медлено на PHP -> не стоит Проблема это мусор в файле данных, кототый нужно регулярно вычищать. Заключение: все эти способы нужны для ОДНОЙ ЦЕЛИ - узнать расположение требуемой строки! Если ты знаешь ГДЕ находится строка, то ничто не мешает тебе переписать ее.
Нет таких функций, разве только file() для чтения всего файла. И главное: нельзя переписать n-ую строку если у нее длина отличная от оригинальной, так как тебе нужно будет переписать заного остальную часть файла - риск потерять данные. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
мдя... я знаю номер строки, знаю ее длину... как нично не мешает ЛЮДИ!!! ВЫ ЧТО ИЗДЕВАЕТЕСЬ НИЧТО НЕ МЕШАЕТ, НИЧТО НЕ МЕШАЕТ СКОЛЬКО МНЕ ЕЩЕ СПРАШИВАТЬ КАК ЭТО СДЕЛАТЬ РАЗ НИЧТО НЕ МЕШАЕТ, КАК -------------------- SEO-мастер |
|||
|
||||
| PROme |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Secandr что-то я в начале не заметил твой пост
что ж, довольно интересно, напомню
вот, только
не проходит почемуто ЗЫ: режим, наверное, надо юзать w+ [добавлю еще чуток] $bytes (длина цифры в файле) определяется верно, но вот, почему не хочет смещать указатель хотя, ИМХО, наскока я понимаю надо в данном месте длину не елемента, а от начала файла... но все равно, ведь и так какого-то не пахает да, а @ применяется для чего? а то забыл... подавляет вывод о ошибках или че Это сообщение отредактировал(а) PROme - 22.1.2004, 17:28 -------------------- SEO-мастер |
||||
|
|||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
off
На Perl это все делается гораздо проще -------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
PROme Смысл в том что я просто выкинул разделители из примера приведённого Sardar`om выше.
@ применяется для именно для подавления ошибок. |
|||
|
||||
| arial |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 772 Регистрация: 11.3.2003 Где: Архангельская обл . Репутация: 6 Всего: 7 |
Зачем нужен MySQL, вы, конечно, не задумывались.
-------------------- Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская) |
|||
|
||||
| PROme |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
я тоже уже задусывался про это... перловку ваще плохо знаю, не приведешь примерчик?
а то что топик нужно читать с начала это не для тебя -------------------- SEO-мастер |
||||
|
|||||
| arial |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 772 Регистрация: 11.3.2003 Где: Архангельская обл . Репутация: 6 Всего: 7 |
А то, что пректы изначально надо писать по человечески, это не для тебя -------------------- Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская) |
||||
|
|||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
блин, ты че тормозишь читал топик файл может быть очень увесистым - 100 и более метров каждый элемент - 1..3 символа вдлину прикинь как это все в БД будет... а + бекап мутить с Win машины... в общем ты так и не прочитал топик - сервер грузнит с БД - тестировалось люди!!! помогите с Perl!!! -------------------- SEO-мастер |
|||
|
||||
| arial |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 772 Регистрация: 11.3.2003 Где: Архангельская обл . Репутация: 6 Всего: 7 |
С файлами ты грузанеш систему не меньше, а база заточена под такие запросы. Это сообщение отредактировал(а) arial - 22.1.2004, 21:14 -------------------- Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская) |
|||
|
||||
| Sardar |
|
||||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Елы-палы... Благо теперь знаем примерные размеры файла и что ты там будешь хранить. Попробую обьяснить на пальцах.
Прозвучал ответ: узнаем где лежит элемент(смещение) - длина_елемента*порядковый_номер, сдвигаем указатель в файле, пишем. Только все элементы должны иметь длинну в 3 байта(устал обьяснять почему).
Скажи что за ошибка была. Писал на лету в текстовое окошко без подсветки, сорри опечатался ;) if(!fseek($fp,$bytes,SEEK_SET)) break;
PROme или ты не внимательно читаешь что мы тут пишем, или мы не успеваем за твоими мыслями
У тебя вообще-то отдельный файл должен быть со смещениями... но по моему зря я это напостил. Ты меня попутал со строками Устал уже отвечать в эту тему, PROme читай внимательно что тебе запостили с самого начала. Arial
Это спорное утверждение Это сообщение отредактировал(а) Sardar - 22.1.2004, 21:37 -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||
|
|||||||||||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
блин, запутали меня уже окончательно...
значит ни на ПХП ни на Перле писать, отталкиваясь тока от порядкового номера строки нельзя
код вставлял с твоей меесаги НО хоть я юзаю тока блокнот, скобку заметил сразу т.е. дело не в ней - он попросту не хочет выполнять перемещение указателя... тут я уже совсем начал задумываться о смысле жизни... arial может с 3-го раза поймешь база заточне под много небольших запросов но эта туча мошкары садит ее на нет моментально к тому же как ты будишь на дельфях выполнять экспорт базы с сервера на Вин платформу с возможностью восстановления в общем если кто еще чего надумает - жду недождусь услышать... а пока буду пробывать вариант с полной перезаписью... блин, де мой пистолет -------------------- SEO-мастер |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
посидел с пол часика и сгенерил следующие:
к стати, массив из 200 000 елементов обрабатывает в мгновение ока... ну ладно у меня вопросы: - насколько это ефиктивный метод? как можно улучшить? - скорее проблема - при многочисленой переписи файла, накапливается много квадратиков (это, я так понял, символы окончания строки в Юниксе или де там...) так будут ли они на сервере Это сообщение отредактировал(а) PROme - 22.1.2004, 22:48 -------------------- SEO-мастер |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Cool
$main=explode(" ", $all[$stroka]); $main[$element]=$zamena; $all[$stroka]="$main[0] $main[1]"; fwrite($fp, implode("\n",$all)); Далее представь сценарий два, одновременных запроса: скрипт1: file() скрипт2: file() - одинаковые данные как и у скрипт1 скрипт1: fwrite(); скрипт2: fwrite() - потеряли данные от скрипт1 Весело -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| PROme |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
вот только не пойму как это работает надо будет завтра с утрица раздуплиться к стати там надо кое-че подправить:
а то пустые строки шпарит... а при таком раскладе implode вобще нужен
а разве flock не для этого? я раздул базы так что скрипты выполнялись 4.4...4.5 секунды, запустил сразу два скрипта... первый отработал как надо, второй подождал пока первый доработает и отработал сам, в итоге второй работал чуть менее 8 сек... целосность файла сохранена... люблю практику -------------------- SEO-мастер |
||||||
|
|||||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Ты знаешь номер строки, следовательно не надо перебирать все строки. В конце склеиваешь все до одной строки и разом пишешь в файл.
Смотри: 1) в файле лежит "а" 2) скрипт1 прочел "a" из файла 3) скрипт2 прочел "а" из файла 4) скрипт1 заблокировал файл 5) скрипт2 ждет блокировки 6) скрипт1 решил записать "б" в файл т.к. раньше было "а" 7) скрипт1 разблокировал файл 8) скрипт2 решил записать "б" и перезаписывает "б" первого скрипта, т.е. как будто скрипт1 не работал. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 44 Всего: 73 |
2 PROme, не надо ... просто потом при записи делаешь implode("\r\n", $line_num); он в конце каждой строки вставит знак окончания строки.
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
| Secandr |
|
||||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Человеки!
А что значит строка
Может имелов в виду:
? ? ? ? ? ? ? ? ? ? |
||||
|
|||||
| PROme |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
ну, не знаю, незнаю, спорить не буду, но погляди сюда:
1) мы вначале октрываем файл в режиме w+ (Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его) 2) далее мы блокируем работу с фалом (вот тока интересно на запись или вобще 3) твои 6),7),8), ИМХО, не верны - посмотри скрипт1 не ведет после блокировки никакой разблокировки - разблокировка непосредственно перед закрытием файта (ну и ясно что далеко после записи) - т.е. если скрипт1 заблокировал файл, то файл заблокирован для ВСЕХ кроме самого блокиратора (скрипта) и ему незачем его разблокировать чтоб произвести запись ну, я так понимаю....
понятно это ж для винды
конечно! и не говори что твой вариант лучше - я теоретик, уже давно проверено: одно и то же на твоем коде выполняется 1.25...1.30 с, мой вариант обеспечивает 0.75...0.8 с разницу чувствуешь к стати, насчет скорости, благодаря тому что Sardar помог убрать цикл скорасть работы скрипта возврасла на 20-25% !!! ЗЫ: у меня сейчас один вопрос остался (пока что ;) ) - насчет блокировки файла - я прав? меня еще смущает место:
нельзя ли в начале закрыть файл, а потом разблокировать а еще слышал что можно и не анлочить файл, что при завершении работы скрипта там все на автомате анлочится (вполне реалистично, например юзер закрыл окно до того как скрипт закончил работу - нужно ж заанлочить файл....) -------------------- SEO-мастер |
||||||||||
|
|||||||||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
PROme Будь теоретиком, я не мешаю.
Смысл $all[$stroka]="$main[0] $main[1]"; : $all[$stroka]=$main[0]." ".$main[1]; Т.е. Строке $stroka массива $all присвоить значение двух ясеек $main. А если у тебя 3 элемента в строке, тогда как? P.S. Кстати $all[$stroka]=$main[0]." ".$main[1]; - будет быстрее. Ненужно время чтобы парсить "". |
|||
|
||||
| PROme |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
это вопрос? я так понимаю будет
ЗЫ: к стати, а ты прав, работает на 5...7% быстрее моего
так кто че хорошего скажет по поводу блокировки файла? -------------------- SEO-мастер |
||||||||
|
|||||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Здесь проблема, ты прочел файл, а затем блокируешь, т.е. два скрипта могут одновременно прочесть файл, а затем кто-то первый его заблокирует. Последний перепишет все результаты и выйдет так, что первый скрипт как будто не работал. Xотя в твоем случае это неважно. Блокировки: LOCK_SH - другие могут читать, но не могут писать в файл LOCK_EX - всем облом, выстраиваются в очередь LOCK_UN - снять блокировку При закрытии файла блокировка автоматически снимается. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| PROme |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
:-/ хочешь сказать что проблема в том... есть файл:
скрипт1 отработал, получили
$s1 - значение с первого скрипта а потом пошел 2-й и сделал:
т.е затер то что делал первый если так, то все ок, мы просто не поняли друг друга - такая ситуация, что скрипты будут изменять одни и те же данные - просто невозможна - по задумке елемент может изменяться только один раз... 1) значит приведенный выше скрипт не может привести к потере вследствии паралельной работе 2) анлок перед закрытием файла можно смело убирать 3) ну, если не будет проблем с многочислеными знаками окончания строки в одной строке, то топик можно считать УСПЕШНО за вершенным 4) если кто еще может подсказать как ускорить или оптимизировать
жду с нетерпением. 5) еще один интересный момент: скрипт1 читает:
но файл немалый, нужно некоторое время... в это время паралельно работающий скприт2 доходит до выполнения:
скрипт1 будет обломан на пол пути до окончания чтения или скрипт2 подожет пока будолага дочитает просто если скрипт2 (ой, боюсь...) не станет ждать никого... скрипт1 прочитает не ту инфу (скорее всего не полностью дочитает), а ведь после того как скрипт2 запишет ВЕРНЫЕ измененные данные, первыйскрипт примется за свою грязную работу и затрет файл своими НЕВЕРНЫМИ прочитаными (недочитаными) данными возможно ли такое 6) ОГРОМНОЕ ВПАСИБО ВСЕМ КТО ОТВЕЧАЛ!!! -------------------- SEO-мастер |
||||||||||||||
|
|||||||||||||||
| Guest |
|
|||
|
Unregistered |
Оба скрипта смогут прочесть файл паралельно, никто никого не обломит! Только при записи ты накладываешь блокировку. Кто не успел ждет(по умолчанию). Прикол что один будет ждать блокировки пока другие не дочитают весь файл, тогда получится n процессов имеющих одинаковые данные, тогда все будут думать что у них самые свежие данные, тогда n процессов дргу задружкой(вот здесь ты используешь блокировку) запишут свои данные, тогда создастся иллюзия как будто работал только один(самый последний) процесс. А почему бы тебе не прочесть файл через fopen()->flock()->fread()->explode(), тогда файл будет заблокирован в самом начале. |
|||
|
||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Елки, этот Guest был я
-------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
если хочешь на Perl создай тему в соответствующем разделе
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| ElectricalStorm |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
вот на Perl (плохое решение)
-------------------- Нужно знать инструмент, которым пользуешься |
||||
|
|||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
вот маленько получше
если ты хочешь с массивом
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| PROme |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
а как насчет этого:
ага, мысля понята, но...
я вобще на ПХП с файлами не очень... не мог бы помочь подправить?
-------------------- SEO-мастер |
||||||||||
|
|||||||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Вообщем так, я написал класс для удобной работы с большими файлами. Класс не грузит файл в память так что сможешь работать хоть с гигабайтными файлами. Как смогу выложу ссылку на форуме, может кому-нибудь еще интересно будет. Только просьба сохранить строку авторства сверху
Вот результаты на моей машине для 2Мб файла: Liba created: 0.00020098686218262 Lines: 100800 Reading sequentiel done: 0.0024261474609375 Reading random done: 0.0036718845367432 Writing sequentiel done: 0.0085330009460449 Writing random done: 0.00011301040649414 Adding done: 0.0071640014648438 Reading/writing random done: 0.006505012512207 All tests done Извиняюсь за narod.ru, но на другие места просто времение нет. Вот ссылка:LibaForPROme v1.0 Еще пару лет Это сообщение отредактировал(а) Sardar - 24.1.2004, 01:07 -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
ElectricalStorm не факт.
1. Кто сказал, что все числа по одной цифре? 2. Нужно учесть перевод строки - два символа \r\n Sardar 500 постов - не горантируют, что тебя примут... |
|||
|
||||
| PROme |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
Sardar спасибо огромное!!!
Там, конечно, такого наворотил... пока будет работать мой вариант... пока в твоем буду разбираться ЗЫ: вот это топик... на Винграде у меня такого еще небыло... -------------------- SEO-мастер |
|||
|
||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
Офтоп:
PROme действительно, редко когда у меня за 1 страницу(40 постов) переваливает |
|||
|
||||
| Raptus Melanholicus |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 6.1.2004 Где: Kiev::Ua Репутация: нет Всего: нет |
PROme Так ты не хочешь использовать БД только из-за того, что не знаешь, как там бекапятся данные?
Это сообщение отредактировал(а) Raptus Melanholicus - 24.1.2004, 12:55 |
|||
|
||||
| ElectricalStorm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 547 Регистрация: 22.1.2004 Репутация: нет Всего: 9 |
Secandr - это же только пример к томуже плохой но если маленько подумать то из его него можно сделать рабочий !
-------------------- Нужно знать инструмент, которым пользуешься |
|||
|
||||
| Sardar |
|
||||||||||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
ИМXО не стоит, т.к. ты грузишь файл целиком, а значит когда файл разрастется скрипт(а может и сервер
Главное не флеймим Дока к класу на скорую руку. Класс представляет файл в виде таблицы:
Метод open() открывает файл с данными, если ранее был открыт другой файл, то он его закрывает. В аргументах ты указываешь: имя_файла, длинна_одного_элемента_в_байтах(3 по умолчанию), кол-во_элементов_в_строке(2 по умолчанию). Возрвратит true при успешном выполнении. alive() показывает открыт ли файл. close() закрывает текущий файл. flush() - принудительно скидывает данные на диск, по идее не используется. Методы работы с файлом: countLines() возвращает количество строк в файле. read(индекс_строки) - возвращает массив с содержимыми полей заданной строки. write(индекс_строки,...) - изменяет содержимое полей в строке. Есть два способа использования: 1) write($index, $coumn1, $column2,...,$columnN) 2) write($index, array($column1, $column2,...,$columnN)) Если переданное поле равно null то берется старое значние: write(5, null, "hoi") - в 6 строке изменится второе поле, первое без изменений. Если надо добавить строку в файл, то указываешь в write() верхний_индкекс+1: write(countLines(),array(7,90)). Все методы кроме write() и read() при ошибках выкидывют Warning'и. write() кидает warning если ты неправильно используешь класс, например при открытии ты указал, что в строке 3 элемента, а при работе даешь только 2. На ошибки чтения/записи предупреждений нет, т.к. не люблю сотни строк warning'ов из циклов, но ты можешь проверять возвращемое значение, true если все ОК. На разработку класса + теста с нуля ушло 4 часа, а на то что бы опубликовать 2 часа - только сейчас доходит как это гиморно найти хороший webspace ElectricalStorm
Perl
А вот аналог на PHP.
Есть разница между что-то делать и что-то делать хорошо учитывая исключения, удобство работы и т.д. Наверное потому получается програмный код больший чем несколько строк -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||
|
|||||||||||||
| PROme |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 23.7.2003 Где: Kiev Репутация: -1 Всего: 1 |
В том то и дело - файл растет с 0, развивают его посетители... т.е. первые 1-2 месяца он вред ли привысит 1-2 метра...
А что такое соотношение есть или ты сам придумал? Я уже давно кликал ИМХО - важнее общий +, а не отношение
2 или 3 раза писал что так медленее выходит... а еще эта SQL-Injection - мало ли что там еще в ближайшее время найдет... ЗЫ: а если подскажешь, ради интереса и развития, с радостью изучу методики... -------------------- SEO-мастер |
||||||
|
|||||||
| Secandr |
|
|||
|
Связист ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4043 Регистрация: 3.8.2003 Где: Russia, Volgograd Репутация: 5 Всего: 39 |
PROme У меня перл работает с логами весом 100-600Мб и ничего всё ОК. Время работы 30-40 сек. Запускается это всё по крону и парсится перлом, на базе полученых данных рисуется графики статистики.
Так что 1-2 Мб это нестрашно. P.S. Хотя перл шустрее работает. P.P.S. PROme Опиши проблему в разделе "БД", может старшие товарищи что посоветуют |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |