Плагин Objective- C вылетает при инициализации большого массива - PullRequest
0 голосов
/ 11 июля 2020

Я работаю над плагином в objective- C, который я запускаю в Osirix. В какой-то момент в плагине я инициализирую два больших массива (которые предназначены для приема изображения 512x512, которое позже загружается в модель CoreML). Исходный плагин использовал модель coreml, которая принимала изображения размером 200x200, переменная IMG_SQSIZE была установлена ​​как 200 ^ 2, и все работало нормально. Теперь я увеличил IMG_SQSIZE до 512 ^ 2, но это приводит к сбою плагина. Если я инициализирую массив и все после того, как не будет cra sh, если я сохраню эту строку, но удаляю все после того, как cra sh сохраняется ... Итак, я пришел к выводу, что это вызывает проблему. Я новичок в Objective- C и X-code, но это похоже на проблему с памятью. Мне интересно, это память, которую мне нужно выделить в коде (она отлично собирается) или это проблема с программой, запускающей плагин. Любой совет был бы отличным, спасибо

#define IMG_SQSIZE      262144 //(512^2)

double tmp_var[IMG_SQSIZE], tmp_var2[IMG_SQSIZE];

1 Ответ

0 голосов
/ 11 июля 2020

Обратите внимание, что 512 ^ 2 НАМНОГО больше 200 ^ 2, и я подозреваю, что это проблема с памятью.

Вы должны выделить память с помощью mallo c и переместить код в C. Это мое предложение, основанное на требованиях - много памяти и множество двойников. Если бы вы могли использовать здесь числа с плавающей запятой или даже целые числа, это также резко уменьшило бы требования к ресурсам, так что посмотрите, может ли это сработать.

По крайней мере, с Objective- C это довольно легко сделать, но вам, вероятно, следует обернуть все этого тоже внутри autoreleasepool.

Давайте сначала попробуем простой способ. Посмотрите, работает ли следующее:

// Allocate the memory
tmp_var  = malloc( IMG_SQSIZE * sizeof( double ) );
tmp_var2 = malloc( IMG_SQSIZE * sizeof( double ) );

if ( tmp_var && tmp_var2 )
{
  // ... do stuff
  // ... see if it works
  // ... if it crashes you have trouble
  // ... when done free - below
}
else
{
  // Needs better handling but for now just to test
  NSLog( @"Out of memory" );
}

// You must to call this, ensure you do not return
// without passing here
free ( tmp_var  );
free ( tmp_var2 );

EDIT

Вот еще одна версия, которая выполняет одиночный mallo c. Не уверен, что будет лучше, но стоит попробовать ... если память не проблема, этот должен работать лучше.

// Supersizeme
tmp_var = malloc( 2 * IMG_SQSIZE * sizeof( double ) );

if ( tmp_var )
{
  // This points to the latter portion
  tmp_var2 = tmp_var + IMG_SZSIZE;

  // ... do stuff
  // ... see if it works
  // ... if it crashes you have trouble
  // ... when done free - below
}
else
{
  // Needs better handling but for now just to test
  NSLog( @"Out of memory" );
}

// You must to call this, ensure you do not return
// without passing here
free ( tmp_var );

Кроме того, в обоих случаях вам необходимо определить переменные как

double * tmp_var;
double * tmp_var2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...