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

Поиск:

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 confused.gif


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


Связист
****


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

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



Код
$file_text=readfile('bla_bla.txt');
$tmp=split('\n',$file_text);
$line=split(' ',$tmp[$j]);
echo $line[$i];
Хотя медлено работать будет smile.gif


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


Опытный
**


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

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



чет я ниче не понял
мне нужно в файле изменить елемент массива, а ты че далconfused.gif


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


Связист
****


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

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



PROme Я после экзамена по термообработке прЕтормаживаю smile.gif

Код
$file_text=readfile('bla_bla.txt');
$tmp=split("\n",$file_text);
$line=split(' ',$tmp[$j]);
$line[$i]='999';//Новое значение
$tmp[$j]=join(' ',$line);
$file_text=join("\n",$tmp);
Хотя можно регулярными выражениями.

Это сообщение отредактировал(а) Secandr - 20.1.2004, 20:52


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


Опытный
**


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

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



Secandr, спасибо, конечно за помощь, но, похоже кто-то чиго-то не понял.

Смотри топик - запись в файл. Собственно именно с этим у меня и проблемы.

Поставлю вопрос проще. Как записать содержимое $bla_bla в файл в нужную строкуconfused.gif

Точнее даже не просто в нужную строку, а обновить (заменить, затереть) существующую старуюconfused.gif

Это сообщение отредактировал(а) PROme - 20.1.2004, 23:34


--------------------
SEO-мастер
PM MAIL WWW   Вверх
[xoodo]
Дата 21.1.2004, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
$fp=fopen("file.txt", "w")
/*--извлекается инфа и обрабатывается, в массиве заменяется элемент -- см.выше--*/
fputs("file.txt", $file_text); /*--записываем получившийся массив--*/
fclose($fp);

Оно?
PM   Вверх
Sardar
Дата 21.1.2004, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Допустим ты хранишь все числа с одинаковой длинной, т.е. "234"," 23","  2" - если надо дополняешь число пробелами.
Количество таких чисел в строке известно, также известно сколько символов разделяют строку.
Тогда:
Код

function change($file, $index, $value) {
$symbol_length=2; //длинна одной цифры в файле
$separator_length=2; //длинна разделителя \r\n
$symbols_in_row=3; //количество символов в строке
$rowlength=($symbol_length*$symbols_in_row)+$separator_length;

$elements=intval($index/$symbols_in_row)*$rowlength+($index%$symbols_in_row)*$symbol_length; //сколько байтов нужно пропустить

if(!is_resource($fp=fopen($file,"a"))) return false; //не уверн на счет режима
do {'
 @flock($fp, LOCK_EX);
 if($index<0||$elements+$symbol_length>filesize($file)) break; //проверяем на грнаницы
 if(!fseek($fp,$elements,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,"93")) echo "Oops!";

Не уверен в режиме открытия файла(может надо "r+"). Идея ясна - если мы знаем длинну элементов, то мы знаем сколько надо пропустить, что бы попасть в нужное место.


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


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 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)
Гораздо лучше применять специфические разделители.


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


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



Вообще все делается намного проще ... чет Вы тут кашу развели ... особенно Secandr со split'om это же изврат ...
делается все так:
Цитата

function chinum($file, $line, $index, $chinum, $sep = ' ') {

// $file - Файл с данными
// $line - строка в которой надо изменить число
// $index - какой номер в строке у изменяемого числа
// $chinum - на что заменить число
// $sep - не обязательный параметр, определяет чем разделены символы в строке

$dat = file($file);
$chiline = explode($sep, $dat[$line]);
$chiline[$index] = $chinum;
$dat[$line]= join(' ', $chiline[$index]);
return $dat; // Функция возвращает массив для дальнейшей записи.

}

// использовать так:
$data = chinum('file.txt', 2, 2, 7);
// Внимание: порядок следования чисел нумеруется от нуля - что бы изменить первое число в
// строке, надо в качестве индекса ввести 0
$f = fopen('file.txt', "w"); // перезаписываем файл с данными
fputs($f, implode("\r\n", $data)); // Записали
fclose($f); // Закрыли файл ...





--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 21.1.2004, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


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

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



Iz@top В принципе идея была такая же.
А чем split хуже explode ?


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


Опытный
**


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

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



О Боже! Терпение-терпение-терпение...
Всем, конечно, спасибо, но я спрашивал под конец уже, можно ли как-то на ПХП переписать отдельную строку в файле.
Перезапись всего файла не катит из-за раааааааааазмеров файла.


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


Бегун
****


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

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



Цитата
Перезапись всего файла не катит из-за раааааааааазмеров файла.

Я так и понял smile.gif.
Ответ: организуй структуру файла так что бы было удобно перемещатся по нему. Так как ты хранишь только числа тебе не нужны заморочки с заголовками, длиннами полей и т.д. С помощью fseek перемещай указатель в нужное положение, пиши то что надо.

Цитата
можно ли как-то на ПХП переписать отдельную строку в файле

Можно если ты знаешь где она находится smile.gif.



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


Опытный
**


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

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



так, ставлю прямой вопрос, плиз КАК заменить 3-ю строку (целиком и полностью) в файле file.txt на содержание переменной $bla_bla confused.gif


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


Бегун
****


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

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



Если файл очень большой то можно хранить смещения до строк в отдельном файле, сами строки будут заканчиваться специальной последовательностью(впрочем ты можешь также хранить и длины строк).
Ты загружаешь файл со смещениями -> находишь смещение нужной строки -> работаешь со строкой.
Заметь столько гемороя нужно для работы со строками переменной длинны!
Если файл небольшой то лучше использовать file()->implode()->fwrite(), но на могопоточном сервере(Апач) этого делать не стоит, т.к. можешь потерять данные. Обходной путь fopen()->flock(LOCK_EX)->explode()->implode()->fwrite();
Пример
Код

//$indw - длинна индекса в байтах
//$offs - имя файла со смещениями
//$datafile - имя файла с данными
//$separator - разделитель, например '|:|'
//$index - индекс строки
//$value - новая строка
$fp=fopen($offs,'r');
if(!is_resource($fp)||!flock($fp,LOCK_SH)) { //под FAT блокировка работать не будет
 trigger_error('Can\'t open offsets file',E_USER_ERROR);
 return false;
}
fseek($fp,$index*$indw,SEEK_SET); //находим нужное смещение
$offset=intval(fread($fp,$indw)); //считываем смещение
flock($fp,LOCK_UN);
fclose($fp);
//data file
$fp=fopen($datafile,'r+'); //до сих пор не уверен в режиме, мы должны перезаписывать строку
if(!is_resource($fp)||!flock($fp,LOCK_EX);) {
 trigger_error('Can\'t open data file',E_USER_ERROR);
 return false;
 }
fseek($fp,$offset,SEEK_SET); ////сдвигаем указатель на начало строки
if(!($data=fread($fp,4096))||($pos=strpos($data,$separator))<0) {
 trigger_error('Data file is damaged',E_USER_ERROR);
 @fclose($fp);
 return false;
}
if(strlen($data=substr($data,0,$pos))<strlen($value)) {//есть ли место
 trigger_error('No space for data',E_USER_ERROR);//нельзя вставить строку большей длинны в середину файла
 @fclose($fp); //можно добавить в конец файла и подредактировать смещения
 return false;
}
fwrite($fp,$value.$separator);
flock($fp,LOCK_UN); //необязательно
fclose($fp);


Писал с головы так что в коде не уверен. Уже нашел недоделки: каждый раз как только ты записываешь строку меньшей длинны ты уменьшаешь максимальный размер поля =\. Выход хранить длины строк.
Если строка не вмещается в середину ты записываешь ее в конец файла данных и правишь ее смещение. При удалении ты удаляешь ее смещение из файла смещений. Смещения обязанны быть все одной длинны, если надо дополняй пробелами.
Время от врмени перестраиваешь весь файл данных.

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

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


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


Связист
****


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

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



Можно модернизировать код предложеный Sardar.
Хранить файл в виде:
001001001001001002002002002002003003003003003
который логически может быть представлен в виде:
Код
 1  1  1  1  1
 2  2  2  2  2
 3  3  3  3  3

Смысл в том, что под каждую запись отделяется по 3 байта, в каждой строке 5 записей - 15 байт, тогда:
Код
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!";

Просто выкидываем все разделители.




--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
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   Вверх
Sardar
Дата 22.1.2004, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Cool smile.gif)) Цикл убираешь полностью:
$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

Весело smile.gif




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


Опытный
**


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

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



Цитата
Цикл убираешь полностью:
$main=explode(" ", $all[$stroka]);
$main[$element]=$zamena;
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("\n",$all));


вот только не пойму как это работаетconfused.gif
надо будет завтра с утрица раздуплиться smile.gif
к стати там надо кое-че подправить:

Код
$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("",$all));


а то пустые строки шпарит...
а при таком раскладе implode вобще нуженconfused.gif

Цитата
Далее представь сценарий два, одновременных запроса:
скрипт1: file()
скрипт2: file() - одинаковые данные как и у скрипт1
скрипт1: fwrite();
скрипт2: fwrite() - потеряли данные от скрипт1


а разве flock не для этого?
я раздул базы так что скрипты выполнялись 4.4...4.5 секунды, запустил сразу два скрипта... первый отработал как надо, второй подождал пока первый доработает и отработал сам, в итоге второй работал чуть менее 8 сек... целосность файла сохранена... люблю практику smile.gif или это не такconfused.gif


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


Бегун
****


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

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



Цитата
вот только не пойму как это работает

Ты знаешь номер строки, следовательно не надо перебирать все строки. В конце склеиваешь все до одной строки и разом пишешь в файл.
Цитата
а разве flock не для этого?

Смотри:
1) в файле лежит "а"
2) скрипт1 прочел "a" из файла
3) скрипт2 прочел "а" из файла
4) скрипт1 заблокировал файл
5) скрипт2 ждет блокировки
6) скрипт1 решил записать "б" в файл т.к. раньше было "а"
7) скрипт1 разблокировал файл
8) скрипт2 решил записать "б" и перезаписывает "б" первого скрипта, т.е. как будто скрипт1 не работал.


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


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



2 PROme, не надо ... просто потом при записи делаешь implode("\r\n", $line_num); он в конце каждой строки вставит знак окончания строки.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Secandr
Дата 23.1.2004, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


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

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



Человеки!
А что значит строка
Код
$all[$stroka]="$main[0] $main[1]";

Может имелов в виду:
Код
$all[$stroka]="implode(" ",$main);

? ? ? ? ? ? ? ? ? ?


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


Опытный
**


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

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



Цитата
Смотри:
1) в файле лежит "а"
2) скрипт1 прочел "a" из файла
3) скрипт2 прочел "а" из файла
4) скрипт1 заблокировал файл
5) скрипт2 ждет блокировки
6) скрипт1 решил записать "б" в файл т.к. раньше было "а"
7) скрипт1 разблокировал файл
8) скрипт2 решил записать "б" и перезаписывает "б" первого скрипта, т.е. как будто скрипт1 не работал.


ну, не знаю, незнаю, спорить не буду, но погляди сюда:

Код
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX);

$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]="$main[0] $main[1]";
fwrite($fp, implode("",$all));

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


1) мы вначале октрываем файл в режиме w+ (Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его)

2) далее мы блокируем работу с фалом (вот тока интересно на запись или вобщеconfused.gif), но, насколько я понимаю работа блокируется ДЛЯ СТОРОННИХ функций, т.е. внутри скрипта где произошла блокировка файл свободен для записи...

3) твои 6),7),8), ИМХО, не верны - посмотри скрипт1 не ведет после блокировки никакой разблокировки - разблокировка непосредственно перед закрытием файта (ну и ясно что далеко после записи) - т.е. если скрипт1 заблокировал файл, то файл заблокирован для ВСЕХ кроме самого блокиратора (скрипта) и ему незачем его разблокировать чтоб произвести запись

ну, я так понимаю....

Цитата
implode("\r\n", $line_num);


понятно
это ж для виндыconfused.gif

Цитата
Человеки!
А что значит строкаCODE
$all[$stroka]="$main[0] $main[1]";

Может имелов в виду:
CODE
$all[$stroka]="implode(" ",$main);

? ? ? ? ? ? ? ? ? ?


конечно!
и не говори что твой вариант лучше - я теоретик, уже давно проверено:
одно и то же на твоем коде выполняется 1.25...1.30 с, мой вариант обеспечивает 0.75...0.8 с разницу чувствуешьconfused.gif

к стати, насчет скорости, благодаря тому что Sardar помог убрать цикл скорасть работы скрипта возврасла на 20-25% !!!

ЗЫ: у меня сейчас один вопрос остался (пока что ;) ) - насчет блокировки файла - я прав?
меня еще смущает место:

Код
flock($fp,LOCK_UN);
fclose($fp);


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


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


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 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]; - будет быстрее. Ненужно время чтобы парсить "".


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


Опытный
**


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

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



Цитата
А если у тебя 3 элемента в строке, тогда как?


это вопрос?
я так понимаю будет

Код
$all[$stroka]=$main[0]." ".$main[1]." ".$main[2];


Цитата
P.S. Кстати $all[$stroka]=$main[0]." ".$main[1]; - будет быстрее. Ненужно время чтобы парсить ""


ЗЫ: к стати, а ты прав, работает на 5...7% быстрее моего

Код
$all[$stroka]="$main[0] $main[1]";


smile.gif

так кто че хорошего скажет по поводу блокировки файла?




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


Бегун
****


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

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



Цитата
$all=file("file.txt");
$count=count($all);

Здесь проблема, ты прочел файл, а затем блокируешь, т.е. два скрипта могут одновременно прочесть файл, а затем кто-то первый его заблокирует. Последний перепишет все результаты и выйдет так, что первый скрипт как будто не работал. Xотя в твоем случае это неважно.
Блокировки:
LOCK_SH - другие могут читать, но не могут писать в файл
LOCK_EX - всем облом, выстраиваются в очередь
LOCK_UN - снять блокировку
При закрытии файла блокировка автоматически снимается.


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


Опытный
**


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

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



Цитата
Здесь проблема, ты прочел файл, а затем блокируешь, т.е. два скрипта могут одновременно прочесть файл, а затем кто-то первый его заблокирует. Последний перепишет все результаты и выйдет так, что первый скрипт как будто не работал. Xотя в твоем случае это неважно.


:-/ хочешь сказать что проблема в том...
есть файл:
Код

1 2 3
4 5 6
7 8 9


скрипт1 отработал, получили

Код

1 2 3
4 5 $s1
7 8 9


$s1 - значение с первого скрипта
а потом пошел 2-й и сделал:

Код

1 2 3
4 5 $s2
7 8 9


т.е затер то что делал первыйconfused.gif

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

1) значит приведенный выше скрипт не может привести к потере вследствии паралельной работеconfused.gif
2) анлок перед закрытием файла можно смело убиратьconfused.gif
3) ну, если не будет проблем с многочислеными знаками окончания строки в одной строке, то топик можно считать УСПЕШНО за вершенным smile.gif
4) если кто еще может подсказать как ускорить или оптимизировать

Код

<?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);

$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]=$main[0]." ".$main[1];
fwrite($fp, implode("",$all));

fclose($fp);

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

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

жду с нетерпением.
5) еще один интересный момент: скрипт1 читает:

Код
$all=file("file.txt");


но файл немалый, нужно некоторое время... в это время паралельно работающий скприт2 доходит до выполнения:


Код
$count=count($all);
$fp=fopen("file.txt","w+");
flock($fp,LOCK_EX); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


скрипт1 будет обломан на пол пути до окончания чтения или скрипт2 подожет пока будолага дочитаетconfused.gif
просто если скрипт2 (ой, боюсь...) не станет ждать никого... скрипт1 прочитает не ту инфу (скорее всего не полностью дочитает), а ведь после того как скрипт2 запишет ВЕРНЫЕ измененные данные, первыйскрипт примется за свою грязную работу и затрет файл своими НЕВЕРНЫМИ прочитаными (недочитаными) данными sad.gifsad.gifsad.gif
возможно ли такоеconfused.gif
6) ОГРОМНОЕ ВПАСИБО ВСЕМ КТО ОТВЕЧАЛ!!!


--------------------
SEO-мастер
PM MAIL WWW   Вверх
Guest
Дата 23.1.2004, 16:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
скрипт1 будет обломан на пол пути до окончания чтения или скрипт2 подожет пока будолага дочитает
просто если скрипт2 (ой, боюсь...) не станет ждать никого... скрипт1 прочитает не ту инфу (скорее всего не полностью дочитает), а ведь после того как скрипт2 запишет ВЕРНЫЕ измененные данные, первыйскрипт примется за свою грязную работу и затрет файл своими НЕВЕРНЫМИ прочитаными (недочитаными) данными
возможно ли такое

Оба скрипта смогут прочесть файл паралельно, никто никого не обломит! Только при записи ты накладываешь блокировку. Кто не успел ждет(по умолчанию). Прикол что один будет ждать блокировки пока другие не дочитают весь файл, тогда получится n процессов имеющих одинаковые данные, тогда все будут думать что у них самые свежие данные, тогда n процессов дргу задружкой(вот здесь ты используешь блокировку) запишут свои данные, тогда создастся иллюзия как будто работал только один(самый последний) процесс.
А почему бы тебе не прочесть файл через fopen()->flock()->fread()->explode(), тогда файл будет заблокирован в самом начале.

  Вверх
Sardar
Дата 23.1.2004, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Елки, этот Guest был я


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


Опытный
**


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

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



если хочешь на Perl создай тему в соответствующем разделе


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


Опытный
**


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

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



Цитата

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 


вот на Perl (плохое решение)

Код

open FILE, "+<text.txt";

$q = 5; # количество символов в строке   (1 2 3) числа + пробелы
$n = 8; # номер строки

$positon = ($q * $n) + $q + 1;

$str = "9 9 9";

seek (FILE, $positon, 1);
print FILE $str;




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


Опытный
**


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

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



вот маленько получше
если ты хочешь с массивом

Код

open FILE, "+<text.txt";

$q = 6; # количество символов в строке  
$n = 8; # номер строки
$positon = ($q * $n) + $q + 1;

seek (FILE, $positon, 1);

$str_next = <FILE>;
@arr = split /\s+/, $str_next;
$arr[2] = 9; # изменяем 3 елемент массива

seek (FILE, 0, 0);
seek (FILE, $positon, 1);
print FILE "$arr[0] $arr[1] $arr[2] ";



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


Опытный
**


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

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



Цитата
Оба скрипта смогут прочесть файл паралельно, никто никого не обломит!


а как насчет этого:

Цитата
LOCK_EX - всем облом, выстраиваются в очередь


confused.gif

Цитата
тогда все будут думать что у них самые свежие данные, тогда n процессов


ага, мысля понята, но...

Цитата
А почему бы тебе не прочесть файл через fopen()->flock()->fread()->explode(), тогда файл будет заблокирован в самом начале


я вобще на ПХП с файлами не очень... не мог бы помочь подправить?

Код
#####################################################################

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

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

$main=explode(" ", $all[$stroka]);
$main[$element]="$zamena\n";
$all[$stroka]=$main[0]." ".$main[1];
fwrite($fp, implode("",$all));

fclose($fp);

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



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


Бегун
****


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

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



Вообщем так, я написал класс для удобной работы с большими файлами. Класс не грузит файл в память так что сможешь работать хоть с гигабайтными файлами. Как смогу выложу ссылку на форуме, может кому-нибудь еще интересно будет. Только просьба сохранить строку авторства сверху smile.gif.

Вот результаты на моей машине для 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 smile.gif
Еще пару лет smile.gif и я доберу эти 500 постов до участника клуба, вот тогда смогу публиковать файлы здесь.

Это сообщение отредактировал(а) Sardar - 24.1.2004, 01:07


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


Связист
****


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

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



ElectricalStorm не факт.
1. Кто сказал, что все числа по одной цифре?
2. Нужно учесть перевод строки - два символа \r\n

Sardar 500 постов - не горантируют, что тебя примут... sad.gif


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


Опытный
**


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

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



Sardar спасибо огромное!!!
Там, конечно, такого наворотил... пока будет работать мой вариант... пока в твоем буду разбираться smile.gifsmile.gifsmile.gif

ЗЫ: вот это топик... на Винграде у меня такого еще небыло... smile.gif


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


Связист
****


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

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



Офтоп:
PROme действительно, редко когда у меня за 1 страницу(40 постов) переваливает smile.gif


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


Новичок



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

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



PROme Так ты не хочешь использовать БД только из-за того, что не знаешь, как там бекапятся данные?

Это сообщение отредактировал(а) Raptus Melanholicus - 24.1.2004, 12:55
PM MAIL WWW ICQ   Вверх
ElectricalStorm
Дата 24.1.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Secandr - это же только пример к томуже плохой но если маленько подумать то из его него можно сделать рабочий !



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


Бегун
****


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

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



Цитата
пока будет работать мой вариант

ИМXО не стоит, т.к. ты грузишь файл целиком, а значит когда файл разрастется скрипт(а может и сервер smile.gif) начнет часто падать.
Цитата
PROme действительно, редко когда у меня за 1 страницу(40 постов) переваливает

Главное не флеймим smile.gif. Жалко что соотношение рейтинг/кол-во постов уменьшается, так что PROme если код понравится плюсик слева wink.gif .
Дока к класу на скорую руку. Класс представляет файл в виде таблицы:
Код

 1  2  3
 4  5  7
56870 ы!

Метод 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 bored.gif .

ElectricalStorm
Цитата
это же только пример к томуже плохой но если маленько подумать то из его него можно сделать рабочий !

Perl
Код

open FILE, "+<text.txt";
$q = 5; # количество символов в строке   (1 2 3) числа + пробелы
$n = 8; # номер строки
$positon = ($q * $n) + $q + 1;
$str = "9 9 9";
seek (FILE, $positon, 1);
print FILE $str;

А вот аналог на PHP.
Код

$q = 5; # количество символов в строке   (1 2 3) числа + пробелы
$n = 8; # номер строки
$fp=fopen("file.txt","r+");
fseek($fp,$q*$n,SEEK_SET);
$str="9 9 9";
fwrite($fp,$str);
fclose($fp);


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


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


Опытный
**


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

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



Цитата
ИМXО не стоит, т.к. ты грузишь файл целиком, а значит когда файл разрастется скрипт(а может и сервер ) начнет часто падать.


В том то и дело - файл растет с 0, развивают его посетители... т.е. первые 1-2 месяца он вред ли привысит 1-2 метра...

Цитата
Жалко что соотношение рейтинг/кол-во постов уменьшается, так что PROme если код понравится плюсик слева  .


А что такое соотношение есть или ты сам придумал?
Я уже давно кликал smile.gif меня обламали - надо иметь 100 постов...
ИМХО - важнее общий +, а не отношение

Цитата
Так ты не хочешь использовать БД только из-за того, что не знаешь, как там бекапятся данные?


2 или 3 раза писал что так медленее выходит... а еще эта SQL-Injection - мало ли что там еще в ближайшее время найдет...
ЗЫ: а если подскажешь, ради интереса и развития, с радостью изучу методики... smile.gif


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


Связист
****


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

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



PROme У меня перл работает с логами весом 100-600Мб и ничего всё ОК. Время работы 30-40 сек. Запускается это всё по крону и парсится перлом, на базе полученых данных рисуется графики статистики.

Так что 1-2 Мб это нестрашно.

P.S. Хотя перл шустрее работает.
P.P.S. PROme Опиши проблему в разделе "БД", может старшие товарищи что посоветуют smile.gif Только подробно опиши: какие данные, в каком количистве, зачем тебе и как часто бекап делать.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1112 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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