Главная страница
    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-1444234918
aka
2015-10-07 19:21
2016.07.24
offline переводчик для андроид


6-1279741373
ppgrachev
2010-07-21 23:42
2016.07.24
idtcpserver как разослать сообщение всем клиентам


2-1413746607
AlexC
2014-10-19 23:23
2016.07.24
Текст на канвасе: получить позицию курсора


15-1440774489
Rouse_
2015-08-28 18:08
2016.07.24
Ха, Windows 10 в крайними обновлениями может повесить систему :)


15-1447240616
AndrewAndrey
2015-11-11 14:16
2016.07.24
Права доступа WinServer2012r2





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский