Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в файл 
:(
    Опции темы
PROme
Дата 22.1.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Спасибо, уже кое-что...
А что в ПХП нет стандартной функции построчной рабоиты с файламиconfused.gif Нужно всего-то записать данные в n-ю строку...

Цитата
ИМXО гиморно это все , лучше подумать нужен ли тебе это огромный файл с данными?. Может легче раскидать все по разным файлам или хранить в БД.


Нужен... sad.gif
Раскидать то легче, но скорость будет меньше - проверено на практике
+ нужно постоянно бекапить, я не представляю как бекапить БД (учитывая что бекап - прога на Дельфях, работающая на другом компе...)

Жду еще ответов. Может все же можно производить построчные запись/удалениеconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
PROme
Дата 22.1.2004, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Secandr я уже писал что нужно чтоб все было построчно.
Представь что надо прочесть 142536-ю строку - при твоем варианте это гораздо сложнее и дольше реализовываться... хотя тоже вариант...


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Sardar
Дата 22.1.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



В моем примере я предложил две структуры файла:
1)файл содержащий элементы с фиксированной длиной - файл смещений
2)файл содержащий элементы с переменной длиной - файл данных
Если тебе нужно хранить текст, то лучше реализовать схему смещения->данные. Иначе, если тебе не жалко дополнить строку пробелами, что бы у всех строк была одинаковая длина, лучше сделать файл с элементами с фиксированной длиной.
Подход смещения->данные позволяет работать с размерами файлов в сотни мегабайт. Запись более длинной строки в середине файла невозможна, т.к. нет места. Варианты:
1)записывать строку в конец файла данных и редактировать смещение. Именно смещение отвечает за порядковый номер строки, а данные раскиданны в любом порядке по файлу данных.
2)делить строку -> очень гиморно -> очень медлено на PHP -> не стоит smile.gif
Проблема это мусор в файле данных, кототый нужно регулярно вычищать.

Заключение:
все эти способы нужны для ОДНОЙ ЦЕЛИ - узнать расположение требуемой строки! Если ты знаешь ГДЕ находится строка, то ничто не мешает тебе переписать ее.

Цитата
А что в ПХП нет стандартной функции построчной рабоиты с файлами Нужно всего-то записать данные в n-ю строку...

Нет таких функций, разве только file() для чтения всего файла. И главное: нельзя переписать n-ую строку если у нее длина отличная от оригинальной, так как тебе нужно будет переписать заного остальную часть файла - риск потерять данные.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
PROme
Дата 22.1.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
все эти способы нужны для ОДНОЙ ЦЕЛИ - узнать расположение требуемой строки! Если ты знаешь ГДЕ находится строка, то ничто не мешает тебе переписать ее.


мдя...
я знаю номер строки, знаю ее длину...

как нично не мешаетconfused.gif

ЛЮДИ!!! ВЫ ЧТО ИЗДЕВАЕТЕСЬconfused.gif

НИЧТО НЕ МЕШАЕТ, НИЧТО НЕ МЕШАЕТconfused.gif

СКОЛЬКО МНЕ ЕЩЕ СПРАШИВАТЬ КАК ЭТО СДЕЛАТЬ РАЗ НИЧТО НЕ МЕШАЕТ, КАКconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
PROme
Дата 22.1.2004, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Secandr что-то я в начале не заметил твой пост
что ж, довольно интересно, напомню

Код
function change($file, $line, $index, $value) {
$symbol_length=3; //длинна одной цифры в файле
$symbols_in_row=5; //количество символов в строке

$bytes=($symbol_length*$symbols_in_row)*($line-1)+($index*$symbol_length);//сколько байтов нужно пропустить

if(!is_resource($fp=fopen($file,"a"))) return false; //не уверн на счет режима
do {'
@flock($fp, LOCK_EX);
if($index<0||$bytes>filesize($file)) break; //проверяем на грнаницы
if(!fseek($fp,$bytes,SEEK_SET) break; //сдвигаем указатель
if(!fwrite($fp, str_pad($value,$symbol_length," ",STR_PAD_LEFT))) break; //условие: у всех элементов длинна одинаковая должно быть сохраненно.
return fclose($fp);
} while(false)
@fclose($fp);
return false;
}
//применяем
if(!change("test.dat",10,5,"93")) echo "Oops!";


вот, только


Код
if(!fseek($fp,$bytes,SEEK_SET) break; //сдвигаем указатель



не проходит почемуто sad.gifsad.gifsad.gif

ЗЫ: режим, наверное, надо юзать w+

[добавлю еще чуток]

$bytes (длина цифры в файле) определяется верно, но вот, почему не хочет смещать указательconfused.gif
хотя, ИМХО, наскока я понимаю надо в данном месте длину не елемента, а от начала файла... но все равно, ведь и так какого-то не пахает hmmm.gif

да, а @ применяется для чего? а то забыл... подавляет вывод о ошибках или чеconfused.gif

Это сообщение отредактировал(а) PROme - 22.1.2004, 17:28


--------------------
SEO-мастер
PM MAIL WWW   Вверх
ElectricalStorm
Дата 22.1.2004, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: нет
Всего: 9



off
На Perl это все делается гораздо проще smile.gif


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Secandr
Дата 22.1.2004, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 5
Всего: 39



PROme Смысл в том что я просто выкинул разделители из примера приведённого Sardar`om выше.

@ применяется для именно для подавления ошибок.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
arial
Дата 22.1.2004, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Зачем нужен MySQL, вы, конечно, не задумывались.


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
PROme
Дата 22.1.2004, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
На Perl это все делается гораздо проще


я тоже уже задусывался про это... перловку ваще плохо знаю, не приведешь примерчик?

Цитата
Зачем нужен MySQL, вы, конечно, не задумывались


а то что топик нужно читать с начала это не для тебяconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
arial
  Дата 22.1.2004, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Цитата(PROme @ 22.1.2004, 20:07)
Цитата
Зачем нужен MySQL, вы, конечно, не задумывались


а то что топик нужно читать с начала это не для тебяconfused.gif

А то, что пректы изначально надо писать по человечески, это не для тебяconfused.gif


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
PROme
Дата 22.1.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



Цитата
А то, что пректы изначально надо писать по человечески, это не для тебя


блин, ты че тормозишьconfused.gif
читал топикconfused.gif
файл может быть очень увесистым - 100 и более метров
каждый элемент - 1..3 символа вдлину
прикинь как это все в БД будет...
а + бекап мутить с Win машины...
в общем ты так и не прочитал топик - сервер грузнит с БД - тестировалось

люди!!! помогите с Perl!!!


--------------------
SEO-мастер
PM MAIL WWW   Вверх
arial
  Дата 22.1.2004, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 772
Регистрация: 11.3.2003
Где: Архангельская обл .

Репутация: 6
Всего: 7



Цитата(PROme @ 22.1.2004, 20:45)
файл может быть очень увесистым - 100 и более метров
каждый элемент - 1..3 символа вдлину
прикинь как это все в БД будет...
а + бекап мутить с Win машины...
в общем ты так и не прочитал топик - сервер грузнит с БД - тестировалось

люди!!! помогите с Perl!!!

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

Это сообщение отредактировал(а) arial - 22.1.2004, 21:14


--------------------
Есть люди, в которых живет Бог. Есть люди, в которых живет дьявол. А есть люди, в которых живут только глисты. (Ф. Раневская)
PM ICQ   Вверх
Sardar
Дата 22.1.2004, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Елы-палы... Благо теперь знаем примерные размеры файла и что ты там будешь хранить. Попробую обьяснить на пальцах.
Цитата
каждый элемент - 1..3 символа вдлину

Прозвучал ответ: узнаем где лежит элемент(смещение) - длина_елемента*порядковый_номер, сдвигаем указатель в файле, пишем. Только все элементы должны иметь длинну в 3 байта(устал обьяснять почему).

Цитата
Код
if(!fseek($fp,$bytes,SEEK_SET) break; //сдвигаем указатель

не проходит почемуто

Скажи что за ошибка была. Писал на лету в текстовое окошко без подсветки, сорри опечатался ;) if(!fseek($fp,$bytes,SEEK_SET)) break;

Цитата
я знаю номер строки, знаю ее длину...

PROme или ты не внимательно читаешь что мы тут пишем, или мы не успеваем за твоими мыслями smile.gif.
Цитата
$bytes (длина цифры в файле) определяется верно, но вот, почему не хочет смещать указатель
хотя, ИМХО, наскока я понимаю надо в данном месте длину не елемента, а от начала файла... но все равно, ведь и так какого-то не пахает

У тебя вообще-то отдельный файл должен быть со смещениями... но по моему зря я это напостил. Ты меня попутал со строками smile.gif, а у тебя просто цифры. Решение в моем первом посте, а лучшее от Secandr'a, без переводов строк красивее и надежнее.
Устал уже отвечать в эту тему, PROme читай внимательно что тебе запостили с самого начала.

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

Это спорное утверждение smile.gif, мы юзаем C'ишные функции, так что все работает быстро. В принципе можно из PHP напрямую работать с MyISAM таблицами, что будет наверное раз 50 медленнее, но человеческому глазу не особо заметно, т.е. полный изврат biggrin.gif.

Это сообщение отредактировал(а) Sardar - 22.1.2004, 21:37


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
PROme
Дата 22.1.2004, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



блин, запутали меня уже окончательно...

значит ни на ПХП ни на Перле писать, отталкиваясь тока от порядкового номера строки нельзяconfused.gif

Цитата
if(!fseek($fp,$bytes,SEEK_SET)) break;


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

arial может с 3-го раза поймешьconfused.gif проверял експереминтально БД не катит
база заточне под много небольших запросов
но эта туча мошкары садит ее на нет моментально
к тому же как ты будишь на дельфях выполнять экспорт базы с сервера на Вин платформу с возможностью восстановленияconfused.gif (бекапить одним словом)

в общем если кто еще чего надумает - жду недождусь услышать... а пока буду пробывать вариант с полной перезаписью... блин, де мой пистолетconfused.gif


--------------------
SEO-мастер
PM MAIL WWW   Вверх
PROme
Дата 22.1.2004, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 23.7.2003
Где: Kiev

Репутация: -1
Всего: 1



посидел с пол часика и сгенерил следующие:

Код
<?php
$mtime = microtime();
$mtime = explode(' ',$mtime);
$t1 = $mtime[1] + $mtime[0];


#####################################################################

$stroka=3;
$element=1;
$zamena=911; //;)

$all=file("file.txt");
$count=count($all);
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX);

for ($i=0;$i<$count;$i++)
{

if ($i==$stroka)
 {
  $main=explode(" ", $all[$i]);
  $main[$element]=$zamena;
  $full="$main[0] $main[1]";
  fwrite($fp,$full);
 }

else fwrite($fp,$all[$i]);
}

flock($fp,LOCK_UN);
fclose($fp);

#######################################################################

$mtime = microtime();
$mtime = explode(' ',$mtime);
$t2 = $mtime[1] + $mtime[0];
$t=round($t2-$t1,4);
echo "$t";
?>


к стати, массив из 200 000 елементов обрабатывает в мгновение ока... ну ладно у меня вопросы:

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

Это сообщение отредактировал(а) PROme - 22.1.2004, 22:48


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0696 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.