Сбой ArcGIS при распределении памяти в C # - PullRequest
0 голосов
/ 06 августа 2009

Я работаю над пользовательским инструментом для ArcGIS, который будет интегрирован с ArcView. Инструмент разработан с использованием C # и в основном подключается к базе данных SQL, извлекает данные в локальную структуру данных, выполняет большой статистический анализ и затем отображает результаты в виде нового слоя.

Сбой происходит во время выполнения этого кода.

LinkedList<SegmentDbRecord> segmentData = new LinkedList<SegmentDbRecord>();
while( dataReader.Read() )
{
  SegmentDbRecord record = new SegmentDbRecord();

  record.first_stop_id = dataReader.GetInt32(0);
  record.first_stopway = dataReader.GetString(1);
  record.first_stopway_X = dataReader.GetString(2);

  record.second_stop_id = dataReader.GetInt32(3);
  record.second_stopway = dataReader.GetString(4);
  record.second_stopway_X = dataReader.GetString(5);

  record.segment_start = Tools.timeToFloat((DateTime)dataReader.GetValue(6));
  record.segment_finish = Tools.timeToFloat((DateTime)dataReader.GetValue(7));

  record.stop1_long = dataReader.GetFloat(8);
  record.stop1_lat = dataReader.GetFloat(9);
  record.stop2_long = dataReader.GetFloat(10);
  record.stop2_lat = dataReader.GetFloat(11);

  record.max_speed = dataReader.GetInt32(12);
  record.avg_speed = dataReader.GetInt32(13);
  record.route_hnd = dataReader.GetInt32(14);
  record.seq_1 = dataReader.GetInt32(15);
  record.seq_2 = dataReader.GetInt32(16);
  record.route_name = dataReader.GetString(17);

  segmentData.AddFirst(record);

}

На данном этапе я просто сохраняю результаты запроса в связанном списке. Я почти уверен, что сбой происходит во время выделения памяти, но я знаю, что все еще остается много памяти, и запрос не возвращает такой большой набор данных. Выполнение простого цикла выделения новых «записей» также очень быстро завершается. Кто-нибудь из вас знает о встроенной защите во время выполнения ArcGIS, которая может помешать мне выделить более определенного объема памяти?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 11 августа 2009

Решение, которое я нашел, состоит в том, чтобы выполнить всю обработку в другом потоке. Как структурирован мой инструмент, событие button отправляло команду «Обработчику заданий» (назовем это так, я не буду делиться своими не столь оригинальными внутренними именами классов), который выполнял ее сразу (так как нет другие работы были запланированы). Я думаю, что, поскольку распределение памяти заняло слишком много времени, ArcGIS считал COM-библиотеку DLL не отвечающей на запросы и обрабатывал ситуацию, просто сбой без каких-либо указаний.

Спасибо всем за ваши всегда полезные ответы.

0 голосов
/ 06 августа 2009

ArcMap спокойно проглатывает исключения из добавленных пользователем компонентов. Вы должны отлавливать и обрабатывать любые исключения, возникающие в вашем коде.

Простой метод устранения неполадок состоит в том, чтобы обернуть весь блок кода в нечто вроде следующего:

try {
    ... 
} catch (Exception ex) { 
    MessageBox.Show(ex.ToString());
    throw;
}

Надеюсь, вы получите информативное сообщение.

0 голосов
/ 06 августа 2009

Давным-давно у нас была таинственная проблема сбоя в Arc GIS. В конце концов мы обнаружили, что дисковая квота была включена на стороне сервера для учетной записи Arc GIS. Удаление квоты решило проблему.

Возможно, вы можете попробовать это, если что-то еще не работает.

0 голосов
/ 06 августа 2009

Это может быть проблема с преобразованием данных. Возьмем для примера строку:

record.max_speed = dataReader.GetInt32(12);
  • Является ли max_speed int32?
  • Является ли поле в позиции 12 значением, которое можно преобразовать в int32?

Что вы можете сделать, это закомментировать все строки, которые присваивают значения, посмотреть, запускаются ли они, а затем добавить строки по одной за раз и посмотреть, какая из них вызывает ошибку.

EDIT

Судя по комментарию, похоже, что проблема связана с использованием LinkedList. Почему бы просто не использовать Список?

...