Begrenzen Sie den großen Ausdruck bei der Verwendung von EXPRTK zusammengestellt
Posted: 11 May 2025, 23:30
Currentyy In meinem Projekt verwende ich exprtk, um eine große Anzahl von Ausdrücken zu laden, die zu einem späteren Zeitpunkt bewertet werden. Einige der Ausdrücke kommen lokal, andere stammen aus externen Quellen. Ich möchte jedoch keine Ausdrücke laden/kompilieren, die eine große Menge an Speicher benötigen.
Der Expressionstyp von Exprtk hat keine Größenmethode zum Aufrufen, um zu erkennen, wie viel Gedächtnis ist. Ich verwende also eine Funktion, die den Gedächtnis des Verfahrens des Prozesses vor und nach den Kompilierungsschritten nennt. Gleichzeitig führt dies zu falsch positiven und negativen Negativen, die den Scheck durchlaufen oder nicht. /> Kurz gesagt, ich möchte Ausdrücke fallen lassen, die beim Zusammenstellen mehr als eine gegebene Grenze im Speicher benötigen. < /p>
Code: Select all
var x := 123; var v[1000] := [1]; sum(2 * v / x);
< /code>
Folgendes ist ungefähr, wie mein Lade -Thread funktioniert: < /p>
typedef exprtk::symbol_table symbol_table_t;
typedef exprtk::expression expression_t;
typedef exprtk::parser parser_t;
std::vector expressionsList;
while (online)
{
std::string newExprString = getNextExpression(transportConext);
expression_t newExpression;
newExpression.register_symbol_table(globalSymbolTable);
auto usedResidentMemoryBefore = System::Utils::getResidentMemoryUsed();
if (!parser.compile(newExprString,newExpression))
{
handleCompilationError(oarser,newExprString);
continiue;
}
auto usedResidentMemoryAfter = System::Utils::getResidentMemoryUsed();
if ((usedResidentMemoryAfter - usedResidentMemoryBefore) > maxMemoryLimit)
{
handleExpressionError(newExprString);
continue;
}
// all is good add new expression
expressionList.push_back(newExpression);
}