[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Извлечение строки и её удаление в файле с мин. выч
Страницы: 1, 2
yuriy
Привет! Файл содержит 100 000 строк. Стоит задача извлечь первую строку из файла и удалить её в файле так, чтобы первой строкой стала вторая и.т.д. Не подскажите как организовать алгоритм с минимальными потерями оперативной памяти и времени вычислений. Спасибо.

_____________
void x;
Valick
лучше конечно использовать базу данных для подобных ситуаций.
а так вам придется вплотную работать со смещением
удалять первую строку файла, брать вторую и записывать на место первой, третью на вторую и тд. до самого конца.
вот только если ошибиться с математикой, то можно кучу данных похерить

_____________
Стимулятор ~yoomoney - 41001303250491
Hello
Считать 10 строк, удалить первую, записать во временный файл
Повторить до конца, без удаления первой строки
Удалить оригинальный файл, переименовать временный в оригинальный

_____________
VPS от 5$, первые 2 месяца - бесплатно.
Игорь_Vasinsky
а если удалять эту строку - оставлять пустую, но потом при чтении (если через file()) - то с FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES, а так действительно - весь файл перебирать придётся.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
yuriy
Понятно. Спасибо! Я чёт тоже пока ничего не могу придумать лучше, чем тупая построковая перезапись файлов. Что-то типа этого:


class lib_TS_getFirstStringAndDelete extends gen_Tblk_ab {

/**
* public function perform()
*
*
@param Iregister $register
*
@param mixed $arrIn
*/

public function perform(Iregister $register = null, array $arrIn = array()) {

$nameFile = preg_replace('#^/#', '', $arrIn[0]);
$postfix = md5($nameFile);
$nameMutex = __CLASS__ . '_' . $postfix;
if (!$register->toEstablishMutex($nameMutex))
return null;

if (file_exists($nameFile)) {
$pathParts = pathinfo($nameFile);
$nameTmpFile = $pathParts['dirname'] . '/' . $pathParts['filename'] . '.tmp';
$string = '';
$condition = false;
$file = fopen($nameFile, 'r');
$fileTmp = fopen($nameTmpFile, 'w');

while (($buffer = fgets($file)) !== false) {
if (!$condition) {
$string = $buffer;
$condition = true;
}
else
fwrite($fileTmp, $buffer . "\r\n");
}

fclose($file);
fclose($fileTmp);

if (unlink($nameFile))
rename($nameTmpFile, $nameFile);

$register->toCleanMutex($nameMutex);
return $string;
}

$register->toCleanMutex($nameMutex);
return null;

}

}



Игорь_Vasinsky
Поясни, что ты имел в виду под
Цитата
а если удалять эту строку - оставлять пустую



_____________
void x;
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.