надо быстро их считать в память и быстро записать новые
сейчас код такой
считывание
Код: Выделить всё
InFile FILE,DRIVER('DOS','/FILEBUFFERS=65535 /QUICKSCAN=ON '),NAME(file_in),PRE(FIN),BINDABLE
RECORD,PRE() !Input file
Buffer BYTE(1),DIM(65535)
END
END
progress REAL(0)
window WINDOW('Обработка файла'),AT(,,340,113),FONT('MS Sans Serif',8,,FONT:bold),CENTER, |
GRAY,DOUBLE,AUTO,MODAL
PROGRESS,USE(progress),AT(37,49,263,15),RANGE(0,100)
END
CODE
if mem>0 ! если память уже выделена, то освобождаем
free(mem)
END
mem = malloc(msize) ! выделение памяти
IF mem = ''
MESSAGE('Insufficient memory available','ERROR',ICON:Hand)
RETURN
END
progress=1
open(window)
DISPLAY()
OPEN(INFile,0) ! откроем файл
IF ERRORCODE() ! обработка ошибок
MESSAGE('Ошибка ' & ERRORCODE() & ' при открытии файла: '& file_in & ERROR(),'ERROR',ICON:Hand)
RETURN
END
length_file = bytes(infile) !длина файла
filesize1=0
DISPLAY()
!Рассмотрим варианты от размера файла
if length_file<65535 then !Файл меньше 64к
get(INFILE,1,length_file)
IF ERRORCODE() THEN
MESSAGE('Ошибка ' & ERRORCODE() & ' при чтении файла: '& file_in & ERROR(),'ERROR',ICON:Hand)
RETURN
END
idx=1
loop length_file times
buff=FIN:buffer[idx]
memcpy(mem+idx, ADDRESS(buff), 1) ! void *memcpy( void *dest, const void *src, size_t count );
idx+=1
progress+=100/length_file
DISPLAY()
END
else
loop while (length_file-filesize1)>65535 !файл больше 64к
get(infile,(filesize1+1),65535)
IF ERRORCODE() THEN
MESSAGE('Ошибка ' & ERRORCODE() & ' при чтении файла: '& file_in & ERROR(),'ERROR',ICON:Hand)
RETURN
END
idx=1
loop 65535 times
buff=FIN:buffer[idx]
memcpy(mem+filesize1, ADDRESS(buff), 1)
idx+=1; filesize1+=1
END
progress+=100/(length_file/65535)
DISPLAY()
END
get(infile,(filesize1+1),(length_file-filesize1))
idx=1
loop length_file-filesize1 times
buff=FIN:buffer[idx]
memcpy(mem+filesize1, ADDRESS(buff), 1)
idx+=1; filesize1+=1
END
progress=100
DISPLAY()
END
close(infile)
close(window)
запись вот такая
Код: Выделить всё
OutFile FILE,DRIVER('DOS','/FILEBUFFERS=65535 /QUICKSCAN=ON '),NAME(file_out),PRE(FOUT),BINDABLE,CREATE
RECORD !Input file
Buffer BYTE(1)!,DIM(65535)
END
END
progress REAL(0)
window WINDOW('Обработка файла'),AT(,,340,113),FONT('MS Sans Serif',8,,FONT:bold),CENTER, |
GRAY,DOUBLE,AUTO,MODAL
PROGRESS,USE(progress),AT(37,49,263,15),RANGE(0,100)
END
CODE
progress=1
open(window)
DISPLAY()
CREATE(OutFile) !Open the file
OPEN(OutFile,2) !Open the file
IF ERRORCODE() ! aborting on any error
MESSAGE('Ошибка ' & ERRORCODE() & ' при открытии файла: '& file_in & ERROR(),'ERROR',ICON:Hand)
RETURN
END
DISPLAY()
LOOP W# = START_POZ_WRFILE TO length_file
memcpy(ADDRESS(buff), mem+W#, 1)
FOUT:buffer= buff
append(outfile)
IF ERRORCODE() ! aborting on any error
MESSAGE('Ошибка ' & ERRORCODE() & ' при записи в файл: '& file_out & ERROR(),'ERROR',ICON:Hand)
RETURN
END
END
progress=100
DISPLAY()
close(OUTfile)
close(window)
Задача в принципе решена, однако скорость загрузки и записи несколько огорчает - те уходит несколько минут
(тк в записи вырезано все связанное с отображением прогресс-бара то она идет быстрее)
те 600мег пишется примерно за 6 минут
Вопрос - всё ли сделано для получения максимального быстродействия или я что-то упустил ?