Привет! Файл содержит 100 000 строк. Стоит задача извлечь первую строку из файла и удалить её в файле так, чтобы первой строкой стала вторая и.т.д. Не подскажите как организовать алгоритм с минимальными потерями оперативной памяти и времени вычислений. Спасибо.
_____________
void x;
лучше конечно использовать базу данных для подобных ситуаций.
а так вам придется вплотную работать со смещением
удалять первую строку файла, брать вторую и записывать на место первой, третью на вторую и тд. до самого конца.
вот только если ошибиться с математикой, то можно кучу данных похерить
_____________
Стимулятор ~yoomoney - 41001303250491
Считать 10 строк, удалить первую, записать во временный файл
Повторить до конца, без удаления первой строки
Удалить оригинальный файл, переименовать временный в оригинальный
_____________
VPS от 5$, первые 2 месяца -
бесплатно.
Игорь_Vasinsky
5.03.2013 - 13:15
а если удалять эту строку - оставлять пустую, но потом при чтении (если через 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
Понятно. Спасибо! Я чёт тоже пока ничего не могу придумать лучше, чем тупая построковая перезапись файлов. Что-то типа этого:
class lib_TS_getFirstStringAndDelete extends gen_Tblk_ab {
@param @param
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;