Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление строки из файла 
:(
    Опции темы
posta
  Дата 25.6.2007, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, как можно удалить текущую строку из текстового файла?

Например, есть цикл, в котором за 1 раз удаляется первая строка файла. 

Особенно учитывая, что файл может достигать 4 гигов.

Это сообщение отредактировал(а) posta - 25.6.2007, 03:41
PM MAIL   Вверх
Sansa
Дата 25.6.2007, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



да, вариантов тут не много... Удаление строки из файла обычно производится созданием копии этого файла, за исключением первой строки smile
Если файл текстовый, то можно разбить его на куски, скажем по 100 Кб, и удалять уже из них. 
Если у тебя цикл, то может быть стоит загрузить часть в память, удалять из памяти, а в конце цикла записать остатки на диск.
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
Alexeis
Дата 25.6.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Сдвинуть все что осталось, т.е. записать поверх той не нужной строчки, а затем обрезать размер файла до (старый размер - длинна строки).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sansa
Дата 25.6.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Разницы нет... Все равно 4 гига двигать
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
Alexeis
Дата 25.6.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Sansa @  25.6.2007,  10:21 Найти цитируемый пост)
Разницы нет... Все равно 4 гига двигать 

  Очень даже есть! Во первых не нужно создавать второй файл такого же размера, во вторых если эта строчка находиться в самом верху, например в верхних 100 Мбайтах то скопировать прийдеться всего 100 Мб а не 4Гб. В любом случае размер скопированных данных будет меньше размера всего файла, вот только размер буфера копирования следует установить 10-15 Мб, иначе головка винчестера будет слишком часто дергаться, а это самая медленная и вредная операция для винчестера. Больше размер ставить бесполезно, так как за время копирования куска большего чем 10-15 Мб операцию чтения начнут прерывать другие операции для своих файловых операций и скорость чтения не возрастет, при этом еще все будет жутко тормозить, так как дисковые операции имеют высокий приоритет. 

  Кстати внутри файла путь головок короче.

Это сообщение отредактировал(а) Alexeis - 25.6.2007, 10:39


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 25.6.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(Alexeis @  25.6.2007,  11:37 Найти цитируемый пост)
Кстати внутри файла путь головок короче.

smile
пояснишь мысль?
PM MAIL   Вверх
Alexeis
Дата 25.6.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



dumb, ну если представить себе благоприятный случай, когда файл лежит одним блоком и все его сектора идут один за другим, то при перемещении данных внутри файла головка винчестера будет перемещаться между смежными или близкими дорожками, т.е. проходить короткий путь. Если же имеем 2 4х гигабайтных файла, расположенных в разных концах диска, то очевидно считав блок данных, для записи ей прийдеться переместиться на много дорожек вверх или вниз, чтобы записать эти данные.

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

  Исходя из этих же соображений переработан стандарт SATA II. 
Цитата(http://www.inteknn.ru/articles/?action=printprod&prod_id=125003)

Во-вторых, поддержка технологии Native Command Queuing (NCQ). Суть данной технологий в том, что команды, поступающие на жесткий диск, выполняются не по приоритету поступления, а помещаются в буфер, который может содержать до 32 команд одновременно. Очередность обработки команд из буфера подбирается с точки зрения оптимизации быстродействия всей системы. Алгоритм направлен на то чтобы цикл команд можно было выполнить за меньшее число оборотов пластин жесткого диска, минимальных траекторий перемещения головок и т.п. Отметим, что поддержка технологии NCQ была заявлена и у некоторых HDD с обычным интерфейсом SATA, просто поддержка NCQ жестким диском стала необходимым критерием соответствия спецификации SATA II.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
posta
  Дата 25.6.2007, 23:14 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile - хочу пример

Ребята, я все же понимаю, что тема головок была интересна ао все времена, но все давайте не удаляться от темы.. =) 

Можно посмотреть реальный пример того, как обрезать 4х гигабайтный файл на первую строку?
И еще, разве нет такой процедуры или функции, как типо Delete [i] для строк? Вроде нет, все уже просмотрел..  
PM MAIL   Вверх
Sansa
Дата 26.6.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну, самый простой... 
Код

procedure FileLeftTrunc (AFileName: String; ALineCount: integer);
var
  LStrings: TStrings;
  I: Integer;
begin
  LStrings:= TStringList.Create();
  LStrings.LoadFromFile(AFileName);
  for I:= 0 to pred(ALineCount) do
     LStrings.Delete(I);
  LStrings.SaveToFile(AFileNAme);
end;

Но нужно буит иметь свободной памяти > чем размер файла. Плюс, быстродействие не фонтан.
Второй вариант (из простых)
Код

procedure FileLeftTrunc (AFileName: String; ALineCount: integer);
const
  TEMP_FILE_NAME= 'temp.file';
var
  LInFile: Text;
  LOutFile: Text;
  I: Integer;
  S: string;
begin
  RenameFile(AFileName, TEMP_FILE_NAME);
  AssignFile(LInFile, TEMP_FILE_NAME);
  Reset(LInFile);
  
  AssignFile(LOutFile, AFileName);
  Rewrite(LOutFile);

  I:= 0;

  while not (Eof(LInFile)) do
  begin
     readln(LInFile, S);
     if I >= pred(ALineCount) then
       writeln(LOutFile, S);
  end;
  CloseFile(LInFile);
  CloseFile(LOutFile);
  DeleteFile(TEMP_FILE_NAME);
end;

Памяти кушает меньше, но по времени не на много быстрее

Добавлено через 3 минуты и 29 секунд
Кстати, может в цикле удалять по строке необязательно? Сначала пройтись по файлу в цикле, а затем, сохранив число обработанных строк, разом удалить их из входного файла
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
Alexeis
Дата 26.6.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Вот мой вариант удаления 1й строчки. Для файла 4,00 Гб удаление строки длинной около 500 символов заняло 1 минуту и 56 секунд.

Код

uses math;
     {$O-}
procedure TForm1.Button1Click(Sender: TObject);
var
  F    : TFileStream;
  b    : byte;
  strl : integer;
  len  : Int64;
  buff : Pointer;
  fromC: Int64;
  toC  : Int64;

  C    : Cardinal;

begin
  F := TFileStream.Create('D:\Tmp.txt', fmOpenReadWrite);
  Repeat
    F.Read(b, 1);
  Until b = $0A;

  strl  := F.Position;

  ProgressBar1.Max := f.Size div 10485760;

  GetMem(buff, 10485760);

  fromC := F.Position; //от конца строки
  toC   := 0;          //в начало

  C  := GetTickCount();

  Repeat
    len := min(F.Size - F.Position - 1, 10485760);

    F.ReadBuffer(buff^, len);
    fromC      := F.Position; //сохраняем позицию чтения

    F.Position := toC;        //устанавливаем позицию с которой писать
    F.WriteBuffer(buff^, len);
    toC        := F.Position; //Сохраняем позинию от которой писать

    F.Position := fromC;      //устанавливаем позицию с которой читать

    ProgressBar1.Position := ProgressBar1.Position + 1;

  Until F.Position = F.Size - 1;

  F.Size := F.Size - strl;

  F.Free;

  C  := GetTickCount() - C ;
  C  := C;

end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W4FhLF
Дата 26.6.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(Alexeis @  26.6.2007,  09:55 Найти цитируемый пост)
Вот мой вариант удаления 1й строчки. Для файла 4,00 Гб удаление строки длинной около 500 символов заняло 1 минуту и 56 секунд.


Можешь назвать:
-процессор 
-интерфейс на которой винт стоит + марка
-система
-приоритет процесса и загруженность системы

Цитата(Alexeis @  26.6.2007,  09:55 Найти цитируемый пост)
ProgressBar1.Position := ProgressBar1.Position + 1;


И если не трудно замерь время без этой строки.

На досуге попробую оптимизировать.

PS:

Цитата(Alexeis @  26.6.2007,  09:55 Найти цитируемый пост)
C  := C;


смысл? smile 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 26.6.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



W4FhLF, да в том то и дело что самые обычные. АТА100шная Баракуда 80Гб.  Проц стоит семпрончик на 2500. XPSP2. Приоритет не менял. В данной ситуации проц не играет особой роли, загрузка всего ~30%.
  
Цитата(W4FhLF @  26.6.2007,  10:22 Найти цитируемый пост)
И если не трудно замерь время без этой строки.

  Шутишь? она вызывается всего 2 раза в секунду smile , на что это может повлиять?

Цитата(W4FhLF @  26.6.2007,  10:22 Найти цитируемый пост)
На досуге попробую оптимизировать.

  Это врядли удасться, чувствую тут хорошо работала оптимизация винды или харда, потому что 35 Мбайт/с для чтения с перезаписью это слишком много, учитывая что для таких хардов реальная скорость чтения не превышает 80 МБайт/с, запись медленнее, а поскольку тут производиться 2 операции, то при скорости записи равной скорости чтения перенос шел бы со скоростью 40 МБайт/с.

Добавлено через 35 секунд
строчка C  := C; нужна для того чтобы на нее брейк поставить smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W4FhLF
Дата 26.6.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(Alexeis @  26.6.2007,  10:39 Найти цитируемый пост)
W4FhLF, да в том то и дело что самые обычные. АТА100шная Баракуда 80Гб.  Проц стоит семпрончик на 2500. XPSP2. Приоритет не менял. В данной ситуации проц не играет особой роли, загрузка всего ~30%.


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

Цитата(Alexeis @  26.6.2007,  10:39 Найти цитируемый пост)
 Шутишь? она вызывается всего 2 раза в секунду  , на что это может повлиять?


Ну дело в том, что здесь постоянно дёргается графическая подсистема, поэтому результаты не совсем точные. Хотя при такой точности это будет незаметно, но однако жеsmile

Цитата(Alexeis @  26.6.2007,  10:39 Найти цитируемый пост)
 Это врядли удасться, чувствую тут хорошо работала оптимизация винды или харда, потому что 35 Мбайт/с для чтения с перезаписью это слишком много, учитывая что для таких хардов реальная скорость чтения не превышает 80 МБайт/с, запись медленнее, а поскольку тут производиться 2 операции, то при скорости записи равной скорости чтения перенос шел бы со скоростью 40 МБайт/с.


А с размером буфера ты играл?

ПС. Как геренил файл?smile Он 4 Гибибайта или Гигабайта? 

Это сообщение отредактировал(а) W4FhLF - 26.6.2007, 10:53


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 26.6.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(W4FhLF @  26.6.2007,  10:51 Найти цитируемый пост)
А с размером буфера ты играл?

  Файловый поток в работе или как правильно выбирать буфер чтения/записи

Цитата(W4FhLF @  26.6.2007,  10:51 Найти цитируемый пост)
ПС. Как геренил файл?

Да удлинил первый попавшийся текстовый файлик до 4х Гб. Думаю винда, что при записи не гоняла буфер назад, а брала его из кеша харда, иначе нельзя объяснить такую большую скорость... 

Это сообщение отредактировал(а) Alexeis - 26.6.2007, 11:03


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W4FhLF
Дата 26.6.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Да, поковырял сорец, переписал на Api, выиграл 2.4% smile И то неизвестно, может случайность. 

Кстати: http://wasm.ru/forum/viewtopic.php?id=14138

Там про файловый кэш ОС говорится немного. 

Это сообщение отредактировал(а) W4FhLF - 26.6.2007, 13:20


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

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


 




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


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

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