Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2016.07.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
ВладОшин ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.005 c
15-1445092188
Дмитрий Белькевич
2015-10-17 17:29
2016.07.24
Отображение меню


15-1441200729
DayGaykin
2015-09-02 16:32
2016.07.24
Определить металл


15-1443997088
pavelnk
2015-10-05 01:18
2016.07.24
Куда выложить код?


2-1416491371
Дмитрий
2014-11-20 16:49
2016.07.24
MySQL, AnyDAC, плавающий "Out of sync"


15-1447832032
Dimka Maslov
2015-11-18 10:33
2016.07.24
Вот интересно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский