Главная страница
    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
2-1416664103
Drowsy
2014-11-22 16:48
2016.07.24
Почему не очищаются Columns in DBGrid?


2-1413238792
Германн
2014-10-14 02:19
2016.07.24
Где кликнули правой кнопкой мыши вызывая попап меню?


15-1441149908
Юрий Зотов
2015-09-02 02:25
2016.07.24
Наиважнейшая проблема...


4-1278405370
tytus
2010-07-06 12:36
2016.07.24
CryptoAPI (Delphi 2010, XP SP3)


15-1445624809
wl
2015-10-23 21:26
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский