Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2016.07.24;
Скачать: CL | DM;

Вниз

нужно быстро отсечь "хвост" массива чисел   Найти похожие ветки 

 
ВладОшин ©   (2015-10-09 16:15) [0]

Есть массив (из файла) целых чисел, значения разные, но под конец идут близкие к 0. Нужно их отсечь. Т.е. сделать другой массив, короче.
Надо максимально быстро по скорости выполнения

например:
1,2,3,435,456,322,0,1,348,735,12,10, 0,1
отсюда нужно откусить
435,456,322,0,1,348,735
т.к. далее(справа) 12,10, 0,1 - числа меньше допуска (близкие к 0)
в середине есть тоже такие, но от них справа есть большие. Надо только хвост из мелких
(слева 1,2,3, - это не надо, оно стандартно)

написал просто
function TForm1.FileAsBS2(FN: string): string;
var
  FS: TFileStream;
  Eps: SmallInt ;
  VInt: SmallInt;
  FromLeft, FromRight, LenAll, CurLen: LongInt;
  i: LongInt;
begin
 Result := "";
 FromLeft := GetCutFromLeft(FN);
 FS := TFileStream.Create(FN, fmOpenRead);
 LenAll := FS.Size;
 CurLen := 0;
 Eps := 100;
 for i := 0 to LenAll div 2 - 2 do // можно и - 100, последние 300-400 всегда меньше допуска
 begin
    FS.Seek(i*2, soFromBeginning);
    FS.Read(VInt,2);
    if VInt > Eps then
      CurLen := i*2;
 end;
 FreeAndNil(FS);
 FromRight := LenAll - CurLen;

// далее просто середина файла переписывается в другой
 CutFromFileAndSaveAs(FN, FromLeft, FromRight, FN+"-new");
end;


быстрее можно?


 
DayGaykin ©   (2015-10-09 16:57) [1]

try finally забыл:)

Если читать блоками (по 4-256 Кб) с конца и проверять блок на наличие больших чисел, то получится быстрее, чем читать по SizeOf(SmallInt) байта. Весь хвост прочитать в любом случае придется.


 
ВладОшин ©   (2015-10-09 17:05) [2]

точно!, с конца же!
спасибо!


 
DayGaykin ©   (2015-10-09 17:07) [3]

И, кстати, если существующий файл не нужен, а нужен только обрезанный, то лучше выполнить FS.Size := X, чем копировать файл.


 
ВладОшин ©   (2015-10-09 17:50) [4]

нужен
оба нужны
есть идея.. и я буду ее думать )

так, накидываю просто пока. Поэтому пока без try finally, блоков
надо проверить можно подменить файлы или нет ..


 
Юрий Зотов ©   (2015-10-10 10:48) [5]

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

CopyMemory


 
Sha ©   (2015-10-11 09:41) [6]

> ВладОшин ©   (09.10.15 17:50) [4]
> нужен, оба нужны

если оба нужны, просто храни одно число - длину остатка


 
DVM ©   (2015-10-11 10:07) [7]


> быстрее можно?

в этом коде самое медленное - операции с файлами, на их фоне все остальное несущественно.


 
ВладОшин ©   (2015-10-15 20:16) [8]

Все получилось,
Спасибо.
Скорость даже больше чем надо, простаивает )

просто храни одно число  
красиво ), но не , мне нужно файл подсовывать одной программе. И новую копию ей же (во втором экземпляре запущенной)



Страницы: 1 вся ветка

Текущий архив: 2016.07.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
15-1441920602
Юрий
2015-09-11 00:30
2016.07.24
С днем рождения ! 11 сентября 2015 пятница


4-1277281791
ANB
2010-06-23 12:29
2016.07.24
Как установить шрифт консольному приложению


15-1441575002
Юрий
2015-09-07 00:30
2016.07.24
С днем рождения ! 7 сентября 2015 понедельник


2-1415010352
Жук
2014-11-03 13:25
2016.07.24
2 штрих-сканнера в одном приложении


15-1442439002
Юрий
2015-09-17 00:30
2016.07.24
С днем рождения ! 17 сентября 2015 четверг