Как извлечь данные (fieldOutputs), которые больше, чем моя RAM из odb-файла Abaqus, используя API C ++

Я использую API C ++ для доступа к * .odb файлам. Чтение файла не проблема, если файл не превышает мою оперативную память.

В документации есть две процедуры для чтения данных (в моем случае fieldOutputs) из odb-файла.

1. Массовые данные

odb_FieldOutput& disp = lastFrame.fieldOutputs()["U"];
const odb_SequenceFieldBulkData& seqDispBulkData = disp.bulkDataBlocks();
int numDispBlocks = seqDispBulkData.size();
for (int iblock=0; iblock<numDispBlocks; iblock++) {
const odb_FieldBulkData& bulkData = seqDispBulkData[iblock];
int numNodes = bulkData.length();
int numComp = bulkData.width();
float* data = bulkData.data();
int* nodeLabels = bulkData.nodeLabels();
for (int node=0,pos=0; node<numNodes; node++) {
int nodeLabel = nodeLabels[node];
cout << "Node = " << nodeLabel;
cout << " U = ";
for (int comp=0;comp<numComp;comp++) {
cout << data[pos++] << " ";
}
cout << endl;
}
}

2 Значение

const odb_SequenceFieldValue& displacements =  lastFrame.fieldOutputs()["U"].values();
int numValues = displacements.size();
int numComp = 0;
for (int i=0; i<numValues; i++) {
const odb_FieldValue val = displacements[i];
cout << "Node = " << val.nodeLabel();
const float* const U = val.data(numComp);
cout << ", U = ";
for (int comp=0;comp<numComp;comp++)
cout << U[comp] << " ";
}
cout << endl;
}

То, что я хотел бы сделать, это прочитать данные из файла и сохранить их в файл Mat.

Форма данных:

Odb-файл — это база данных, которая может быть представлена ​​в виде древовидной структуры.

Содержит шаги. Каждый шаг содержит кадры, а каждый кадр содержит fieldOutputs.
Эти fieldOutputs могут быть матрицами или векторами. Размерность зависит от количества узлов и количества параметров на fieldOutput.

Мой вопрос:

Способна ли одна из упомянутых подпрограмм загружать файлы больше, чем объем ОЗУ? Если да, я был бы рад получить несколько подсказок.

Дополнительная информация:

Документация:
http://abaqus.software.polimi.it/v6.12/books/ker/default.htm
а также
Http: //xn--90ajn.xn--p1ai: 2080 / V6.12 / pdf_books / SCRIPT_USER.pdf
Я использую Abaqus 6.12
и компилятор visual studio 2010.

0

Решение

Одно выходное поле действительно больше вашей оперативной памяти? У вас есть> 1 млрд элементов?

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

Там вы можете исчерпать память, потому что API Abaqus Odb не освобождает память правильно (на мой взгляд). В C ++ API есть несколько недокументированных функций для освобождения памяти, которые я могу предоставить, если найду их.

Даже с этим я не мог получить API для освобождения памяти. Я обошел эту проблему в (открытие Odb -> прочитать кусок данных -> закрыть Odb -> снова открыть odb и прочитать следующий кусок данных)
Мое наблюдение состояло в том, что было бы полезно подождать 1 или две секунды после каждого фрагмента, чтобы память освобождалась должным образом.

Таким образом, чтение фрагмента данных после фрагмента в Matlab (сохранение его в Matlab) будет способом заставить его работать.

Конечно, массовый подход был бы полезен, если вы прочитали все поле Outputs.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector