Страница 2 из 4

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 10:54
Admin
Вообще наверное стоит посмотреть в сторону очереди или malloc + memcpy

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 11:18
kreator
Admin писал(а):MaxArray должна быть константой.
На самом деле не обязательно. В момент определения массива MaxArray должна быть определена. Я конечно не точно написал, MaxArray должен приходить извне. Массивы как-то не кларионовская тема, поэтому и примера у меня нет. Можно посмотреть в libsrc, например, FuzzyClass.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 11:38
SuperMax
хочу массив байтов - те считать файл, провести обработку и записать новый

копаясь в старых исходниках нашел всякие тесты производительности различных драйверов (topspeed clarion итд) в различных режимах
и прочую фигню
той программки не нашел, но нашел переделку из нее - тест CPU - ALU/FPU - помню сравнивал тогда AMD k6-2 c P2
и в нем нашел декларацию:

Код: Выделить всё

AA                      LONG(0),DIM(1024000)    ! вход анализа - исходный реальный массив
CC                      SREAL(0),DIM(1024000)    ! вход анализа - исходный реальный массив
те комментарии от той программки регрессионного анализа

самое интересно что на CW10 прокатывает:

Код: Выделить всё

AC                 ULONG(0),DIM(1024000),STATIC
AB                  ULONG(0),DIM(1024000),STATIC
AV                  byte(0),DIM(4025000),STATIC
а вот

Код: Выделить всё

AD                  long(0),DIM(4025000),STATIC
AB                  ULONG(0),DIM(2024000),STATIC
array to big
получается массив не может быть больше 4МБ
я-то сразу стал ставить массив в гигабайт и обломался, подумав что ограничение в 65535 (в интерфейсе кстати оно такое и есть)

а как я 300 мег сжирал регрессионным анализом так и не вспомнил.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 12:32
Дед Пахом
SuperMax писал(а): хочу массив байтов - те считать файл, провести обработку и записать новый
STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:03
Ал
Дед Пахом писал(а):
SuperMax писал(а): хочу массив байтов - те считать файл, провести обработку и записать новый
STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
:!: :cat: :)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:05
kreator
Дед Пахом писал(а):STRING и есть массив байтов. Объявляй bytearr &STRING и создавай bytearr &= NEW STRING(4000000)
С 4 Мегами проблем нет. Товарищ хочет 300 или ещё лучше 1 Гиг. Можно посоветовать BLOB, но работа не тривиальна с этим делом.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:36
Дед Пахом
В C10 help написано что
In general, there is a limit to size of data objects declared in global, module or local scope: 4MB. The compiler can report different errors depending from the type of data object exceeding this limit. Particularly, arrays with variable dimensions may be of a slightly greater size than 4MB.
Если бы размерность массива превышала 32 бита, к его элементам нельзя было бы обратиться через array, потому что I тоже 32 бита.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:42
Admin
Вот 1 гиг

Код: Выделить всё

  PROGRAM
  MAP
    module('runtime')
      malloc(signed),long,name('_malloc')
      free(long),name('_free')
      memcpy(Long,Long,Unsigned),Name('_memcpy')
    end
  END
  
msize long(1024*1024*1024)
mem   long 
buff  byte
all   long                   
  
  CODE
  mem = malloc(msize)

  ! пишем в память
  LOOP W# = 1 TO msize
    buff = 1
    memcpy(mem+W#, ADDRESS(buff), 1)
  END
    
  ! читаем из памяти 
  LOOP W# = 1 TO msize
    buff = 0
    memcpy(ADDRESS(buff), mem+W#, 1)
    all += buff
  END
  MESSAGE(all)

  free(mem)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:44
Admin
Если есть памяти достаточно, можете 10 или 20 таких блоков по 1Gb выделить. Все в ваших руках.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:45
Admin
Кстати может через &BYTE и ADDRESS быстрее будет. если так можно. лениво вдаваться.

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 13:47
Admin
Ага... и считать в цикле с нуля до msize-1. А то за границу вылезти можно на байтик :)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 15:01
Дед Пахом
Что-то я какую-то чушь про биты написал, не проснулся ещё :-)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 10 Ноябрь 2015, 15:26
Admin
Дед Пахом писал(а): Что-то я какую-то чушь про биты написал, не проснулся ещё :-)
Бывает. Сам иногда напишу что то. И тут же удаляю :)
Ну или остается :)

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 12 Ноябрь 2015, 9:29
SuperMax
Admin писал(а): Вот 1 гиг
у меня не получилось
те

Код: Выделить всё

        mem = malloc(msize)         ! выделение памяти        
               
        IF mem = ''                         
            MESSAGE('Insufficient memory available','ERROR',ICON:Hand)                
            RETURN                                    
        END   


а далее

Код: Выделить всё

        buff = 1
        memcpy(mem, ADDRESS(buff), 1)
вызывает
Exception occurred at address 0101BDF4
Exception code C0000005: Access Violation
....
я что-то не так сделал ?
CW10 винда 7-ка 64бита

зы: откопал свою программку с регрессиями - там тоже порции по 4МБ, просто из-за количества массивов сумма получилась приличная

Максимальный размер массива в 32 битном приложении MAX DIM

Добавлено: 12 Ноябрь 2015, 9:34
Admin
Кстати я тут посмотрел еще раз код примера. Не уверен что он правильный.
Никогда не работал с malloc и memcpy и писал на коленке. Извиняюсь.