file или fread

yaniks

новичок
file или fread

есть файлы по полметра, необходимо выполнять некоторые операции со строками
как будет более правильно считывать файл ?
1. через file, тоесть сразу загоняем в массив и через цикл выполняем опереции
2. через fread , цикл { считываем кусками допустим по 10 kb, дробим на строки, выполняем операции, очищаем массив }
 

fixxxer

К.О.
Партнер клуба
Читаем ман по [m]microtime[/m], пишем тесткейсы, сравниваем скорость, самостоятельно делаем выводы, и больше не ходим на форум с подобными вопросами. ;)
 

yaniks

новичок
alpine
Так в том то и дело что в будущем они увеличатся


fixxxer
хороший ответ :),
тесты эт хорошо, но :
1 - лень.
2 - тест могу провести максимум на трех машинах, и под одной версией движка , а это не показатель достоверности ))

... хотя если нет аргументированного ответа, придется так и сделать :(
 

neko

tеam neko
хотя если нет аргументированного ответа, придется так и сделать
это я так понял тебе надо для новой китайской ракеты, да?
или для тваей дамашней странички?
какие операции? какие файлы?
какой ты тут ответ ожидаешь, с таким вопросом?

{ считываем кусками допустим по 10 kb, дробим на строки, выполняем операции, очищаем массив }
читаем ман [M]fgets[/M]

кстати, file() выживает и на 100мб файлах, проверяли
медленно, но на ночь поставить можно один раз
а главное, программа пишется за минуту
 

Demiurg

Guest
yaniks
неужели ты думаешь, что если тебе лень, то за тебя кто-то будет это делать ?
 

empty

Guest
yaniks
Чес говоря мне file не нравится.
Я делаю так:

PHP:
$artists_base = "../path/to/my/base.txt"


//Создаём временый файлик
$tempname = tempnam($_SERVER["DOCUMENT_ROOT"]."/path/", "TEMP");
//Определяем размер моей базы для цикла while, см. ниже
$string_size = filesize($artists_base);
//Открываем базу
$fop = fopen($artists_base,"r");
//Блокировка
flock($fop,2);
	//Открываем временый файлик
	$top = fopen($tempname,"w") or die("Не могу открыть файл!");
	//Блокировка
	flock($top,2);
	//Получаем полную очередную строку из файла-базы $artists_base
		while($string = rtrim(fgets($fop,$string_size)))
		{
		//какие-то действия
		}
	//Закрываем
	flock($top,3);
	fclose($top);
//Закрываем
flock($fop,3);
fclose($fop);
			
//Удаляем устаревший файл-базу
unlink($artists_base);
//Переименовываем временный файлик в файлик-базу
rename($tempname, $artists_base);
 

neko

tеam neko
какое-то странное использование второго параметра к fgets
или у тебя может быть строка длинной 10.000 символов? :)
 

yaniks

новичок
Автор оригинала: neko
это я так понял тебе надо для новой китайской ракеты, да?
Да, а китайская ракета что то типа dump БД, подогнаная к формату текстового файла с разделителями
......

кстати, file() выживает и на 100мб файлах, проверяли
медленно, но на ночь поставить можно один раз
а главное, программа пишется за минуту

))

Автор оригинала: Demiurg

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

Orlis

Guest
.http://ru.php.net/manual/ru/function.file-get-contents.php

file_get_contents -- Получить содержимое файла в виде одной строки
Описание
строка file_get_contents ( строка имя_файла [, целое использовать_include_path [, ресурс контекст]])


Данная функция идентична функции file() с той только разницей, что содержимое файла возвращается в строке.

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует алгоритм 'memory mapping' (если поддерживается операционной системой).

Замечание: Эта функция безопасна для обработки данных в двоичной форме
 

empty

Guest
Orlis
ага, а потом строку иксплодить двадцать раз, да?
 

alpine

Новичок
empty
Да вобщем-то один раз. Может даже в его случае лучше регами пройтись по одной большой строке. Кто его знает с какой он там базы что дампит и что хочет вытянуть ...
 

asdd

Guest
вариант:
$db=fopen("data.txt");
while($Buff=fgets($db,1024*10)){
//
//текущая строка файла находиться в $buff
//делай с ней что надо
unSet($Buff);
}

способ хорош тем что почти не требует памяти. (1024*10 байт)

теперь насчёт тестов:
вариант с $buff=file("data.txt"); быстрее на 15-25%, однако здесь жрётся память.
если вопрос ограничения памяти не стоит то юзай вариант 1.

ps
вобше говоря вункция file() делает тоже самое что и второй вариант который (читает файл , разбивает его по "\n" и возвращает массив ) я написал выше, однако это уже стандартная функция php поэтому работает быстрее чем аналогичный скрипт нсамом php

ИМХО.
 

yaniks

новичок
Orlis
вариант "file_get_contents" анологичен "file", мне не нужно загружать весь файл в память

asdd
уже использую аналогичный вариант
 

empty

Guest
ужас.

while($string=fgets($file,1024*10)){

зачем 1024*10 ? почему именно на 10?


$_end_element=count($ARRAY)-1;
$ending=$ARRAY[$_end_element];
unset($ARRAY[$_end_element]);

ничё не понял, нафик это надо...
 

yaniks

новичок
sorry, херню сморозил :(

всегда считал, что fgets считывает весь поток, а ни только строку .....
 
Сверху