Tango: updated how memory used and database size are computed

This commit is contained in:
matlabbe
2017-10-09 18:04:54 -04:00
parent 66e79e23cb
commit 007d23308a
8 changed files with 60 additions and 127 deletions

View File

@@ -2,7 +2,7 @@
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.introlab.rtabmap"
android:versionCode="64"
android:versionCode="65"
android:versionName="@RTABMAP_VERSION@">
<uses-permission android:name="android.permission.CAMERA" />

View File

@@ -184,9 +184,6 @@ RTABMapApp::RTABMapApp() :
lastDrawnCloudsCount_(0),
renderingTime_(0.0f),
lastPostRenderEventTime_(0.0),
processMemoryUsedBytes_(0),
processGPUMemoryUsedBytes_(0),
databaseInMemory_(false),
visualizingMesh_(false),
exportedMeshUpdated_(false),
optMesh_(new pcl::TextureMesh),
@@ -238,8 +235,6 @@ void RTABMapApp::onCreate(JNIEnv* env, jobject caller_activity)
lastDrawnCloudsCount_ = 0;
renderingTime_ = 0.0f;
lastPostRenderEventTime_ = 0.0;
processMemoryUsedBytes_ = 0;
processGPUMemoryUsedBytes_ = 0;
bufferedStatsData_.clear();
progressionStatus_.setJavaObjects(jvm, RTABMapActivity);
main_scene_.setBackgroundColor(backgroundColor_, backgroundColor_, backgroundColor_);
@@ -379,7 +374,6 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
parameters.insert(rtabmap::ParametersPair(rtabmap::Parameters::kDbSqlite3InMemory(), uBool2Str(databaseInMemory)));
LOGI("Initializing database...");
rtabmap_->init(parameters, databasePath);
databaseInMemory_ = databaseInMemory;
rtabmapThread_ = new rtabmap::RtabmapThread(rtabmap_);
if(parameters.find(rtabmap::Parameters::kRtabmapDetectionRate()) != parameters.end())
{
@@ -483,14 +477,6 @@ int RTABMapApp::openDatabase(const std::string & databasePath, bool databaseInMe
UERROR("Failed to uncompress data!");
status=-2;
}
const rtabmap::Signature & s = signatures.at(id);
processMemoryUsedBytes_ += s.getMemoryUsed(databaseInMemory_);
if(databaseInMemory_)
{
processMemoryUsedBytes_ -= s.sensorData().imageRaw().total() * s.sensorData().imageRaw().elemSize();
processMemoryUsedBytes_ -= s.sensorData().depthOrRightRaw().total() * s.sensorData().depthOrRightRaw().elemSize();
processMemoryUsedBytes_ -= s.sensorData().laserScanRaw().total() * s.sensorData().laserScanRaw().elemSize();
}
}
else
{
@@ -1161,8 +1147,6 @@ int RTABMapApp::Render()
lastDrawnCloudsCount_ = 0;
renderingTime_ = 0.0f;
lastPostRenderEventTime_ = 0.0;
processMemoryUsedBytes_ = 0;
processGPUMemoryUsedBytes_ = 0;
bufferedStatsData_.clear();
}
@@ -1176,7 +1160,6 @@ int RTABMapApp::Render()
if(added.size() != meshes)
{
LOGI("added (%d) != meshes (%d)", (int)added.size(), meshes);
processGPUMemoryUsedBytes_= 0;
boost::mutex::scoped_lock lockRtabmap(rtabmapMutex_);
UASSERT(rtabmap_!=0);
for(std::map<int, Mesh>::iterator iter=createdMeshes_.begin(); iter!=createdMeshes_.end(); ++iter)
@@ -1211,23 +1194,6 @@ int RTABMapApp::Render()
main_scene_.addMesh(iter->first, iter->second, opengl_world_T_rtabmap_world*iter->second.pose);
main_scene_.setCloudVisible(iter->first, iter->second.visible);
long processCPUMemoryUsed = 0;
processCPUMemoryUsed += iter->second.cloud->size()*4*4; // 3*float + 1 float rgb
processCPUMemoryUsed += iter->second.indices->size()*4; // int
processCPUMemoryUsed += iter->second.polygons.size()*4*3; // 3 indices per polygon
processCPUMemoryUsed += iter->second.polygonsLowRes.size()*4*3; // 3 indices per polygon
processGPUMemoryUsedBytes_ += iter->second.cloud->size()*4; // organized indices to dense
processGPUMemoryUsedBytes_ += processCPUMemoryUsed; // mostly copy all data
processGPUMemoryUsedBytes_ += iter->second.polygons.size()*4*2*3; // 2 int indices per line (3 lines per polygon)
processGPUMemoryUsedBytes_ += iter->second.polygonsLowRes.size()*4*2*3; // 2 int indices per line (3 lines per polygon)
processGPUMemoryUsedBytes_ += (iter->second.cloud->width/2*iter->second.cloud->height/2)*4; // low dec
processGPUMemoryUsedBytes_ += (iter->second.cloud->width/4*iter->second.cloud->height/4)*4; // low low dec
if(!iter->second.texture.empty())
{
processGPUMemoryUsedBytes_ += iter->second.texture.total()*sizeof(float); // single float rgb per pixel
processGPUMemoryUsedBytes_ += iter->second.cloud->size()*4*2; // 2*float, texCoords
}
iter->second.texture = cv::Mat(); // don't keep textures in memory
}
}
@@ -1262,32 +1228,20 @@ int RTABMapApp::Render()
int smallMovement = (int)uValue(stats.data(), rtabmap::Statistics::kMemorySmall_movement(), 0.0f);
int fastMovement = (int)uValue(stats.data(), rtabmap::Statistics::kMemoryFast_movement(), 0.0f);
int rehearsalMerged = (int)uValue(stats.data(), rtabmap::Statistics::kMemoryRehearsal_merged(), 0.0f);
if(smallMovement == 0 && rehearsalMerged == 0 && fastMovement == 0)
if(!localizationMode_ && stats.getSignatures().size() &&
smallMovement == 0 && rehearsalMerged == 0 && fastMovement == 0)
{
if(stats.getSignatures().size())
int id = stats.getSignatures().rbegin()->first;
const rtabmap::Signature & s = stats.getSignatures().rbegin()->second;
if(!trajectoryMode_ &&
!s.sensorData().imageRaw().empty() &&
!s.sensorData().depthRaw().empty())
{
int id = stats.getSignatures().rbegin()->first;
const rtabmap::Signature & s = stats.getSignatures().rbegin()->second;
if(!localizationMode_)
{
if(!trajectoryMode_ &&
!s.sensorData().imageRaw().empty() &&
!s.sensorData().depthRaw().empty())
{
uInsert(bufferedSensorData, std::make_pair(id, s.sensorData()));
}
uInsert(rawPoses_, std::make_pair(id, s.getPose()));
processMemoryUsedBytes_ += s.getMemoryUsed(databaseInMemory_);
if(databaseInMemory_)
{
processMemoryUsedBytes_ -= s.sensorData().imageRaw().total() * s.sensorData().imageRaw().elemSize();
processMemoryUsedBytes_ -= s.sensorData().depthOrRightRaw().total() * s.sensorData().depthOrRightRaw().elemSize();
processMemoryUsedBytes_ -= s.sensorData().laserScanRaw().total() * s.sensorData().laserScanRaw().elemSize();
}
}
uInsert(bufferedSensorData, std::make_pair(id, s.sensorData()));
}
uInsert(rawPoses_, std::make_pair(id, s.getPose()));
}
int loopClosure = (int)uValue(stats.data(), rtabmap::Statistics::kLoopAccepted_hypothesis_id(), 0.0f);
@@ -1450,24 +1404,6 @@ int RTABMapApp::Render()
#ifdef DEBUG_RENDERING_PERFORMANCE
LOGW("Adding mesh to scene: %fs", time.ticks());
#endif
long processCPUMemoryUsed = 0;
processCPUMemoryUsed += mesh.cloud->size()*4*4; // 3*float + 1 float rgb
processCPUMemoryUsed += mesh.indices->size()*4; // int
processCPUMemoryUsed += mesh.polygons.size()*4*3; // 3 indices per polygon
processCPUMemoryUsed += mesh.polygonsLowRes.size()*4*3; // 3 indices per polygon
processMemoryUsedBytes_ += processCPUMemoryUsed;
processGPUMemoryUsedBytes_ += mesh.cloud->size()*4; // organized indices to dense
processGPUMemoryUsedBytes_ += processCPUMemoryUsed; // mostly copy all data
processGPUMemoryUsedBytes_ += mesh.polygons.size()*4*2*3; // 2 int indices per line (3 lines per polygon)
processGPUMemoryUsedBytes_ += mesh.polygonsLowRes.size()*4*2*3; // 2 int indices per line (3 lines per polygon)
processGPUMemoryUsedBytes_ += (mesh.cloud->width/2*mesh.cloud->height/2)*4; // low dec
processGPUMemoryUsedBytes_ += (mesh.cloud->width/4*mesh.cloud->height/4)*4; // low low dec
if(!mesh.texture.empty())
{
processGPUMemoryUsedBytes_ += mesh.texture.total()*sizeof(float); // single float rgb per pixel
processGPUMemoryUsedBytes_ += mesh.cloud->size()*4*2; // 2*float, texCoords
}
mesh.texture = cv::Mat(); // don't keep textures in memory
}
}
@@ -3260,7 +3196,7 @@ bool RTABMapApp::handleEvent(UEvent * event)
jclass clazz = env->GetObjectClass(RTABMapActivity);
if(clazz)
{
jmethodID methodID = env->GetMethodID(clazz, "updateStatsCallback", "(IIIIFIIIIIIIFIFIFFFIFFFFFF)V" );
jmethodID methodID = env->GetMethodID(clazz, "updateStatsCallback", "(IIIIFIIIIIIFIFIFFFIFFFFFF)V" );
if(methodID)
{
env->CallVoidMethod(RTABMapActivity, methodID,
@@ -3271,7 +3207,6 @@ bool RTABMapApp::handleEvent(UEvent * event)
updateTime,
loopClosureId,
highestHypId,
(int)((processMemoryUsedBytes_+processGPUMemoryUsedBytes_+databaseMemoryUsed)/(1024*1024)),
databaseMemoryUsed,
inliers,
matches,

View File

@@ -228,10 +228,7 @@ class RTABMapApp : public UEventsHandler {
int lastDrawnCloudsCount_;
float renderingTime_;
double lastPostRenderEventTime_;
long processMemoryUsedBytes_;
long processGPUMemoryUsedBytes_;
std::map<std::string, float> bufferedStatsData_;
bool databaseInMemory_;
bool visualizingMesh_;
bool exportedMeshUpdated_;

View File

@@ -183,6 +183,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
private Date mDateOnPause = new Date();
private long mLastFastMovementNotificationStamp = 0;
private boolean mBlockBack = true;
private long mFreeMemoryOnStart = 0;
private MenuItem mItemSave;
private MenuItem mItemOpen;
@@ -237,7 +238,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
private AlertDialog mMemoryWarningDialog = null;
private final int STATUS_TEXTS_SIZE = 18;
private final int STATUS_TEXTS_SIZE = 19;
private final int STATUS_TEXTS_POSE_INDEX = 5;
private String[] mStatusTexts = new String[STATUS_TEXTS_SIZE];
@@ -274,6 +275,8 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.menu_name);
mFreeMemoryOnStart = getFreeMemory();
// Query screen size, the screen size is used for computing the normalized
// touch point.
@@ -809,8 +812,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
if(!DISABLE_LOG) Log.i(TAG, String.format("called setCamera(type=%d);", type));
// for convenience, for a refresh of the memory used
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(Debug.getNativeHeapAllocatedSize()/(1024*1024));
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(getFreeMemory());
long freeMemory = getFreeMemory();
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(mFreeMemoryOnStart>freeMemory?mFreeMemoryOnStart-freeMemory:0);
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(freeMemory);
updateStatusTexts();
RTABMapLib.setCamera(type);
@@ -1014,7 +1018,6 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
}
private void updateStatsUI(
int processMemoryUsed,
int loopClosureId,
int inliers,
int matches,
@@ -1031,10 +1034,10 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
if(!mButtonPause.isChecked())
{
//check if we are low in memory
long memoryUsed = processMemoryUsed;
long memoryFree = getFreeMemory();
long memoryUsed = mFreeMemoryOnStart>memoryFree?mFreeMemoryOnStart-memoryFree:0;
if(memoryFree < 200)
if(memoryFree < 400)
{
mButtonPause.setChecked(true);
pauseMapping();
@@ -1145,7 +1148,6 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
final float updateTime,
final int loopClosureId,
final int highestHypId,
final int processMemoryUsed,
final int databaseMemoryUsed,
final int inliers,
final int matches,
@@ -1178,28 +1180,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
statusTexts[0] = mStatusTexts[0];
}
if(mButtonPause!=null)
{
if(!mButtonPause.isChecked())
{
// getNativeHeapAllocatedSize() is too slow, so we need to use the estimate.
statusTexts[1] = getString(R.string.memory)+processMemoryUsed;
}
else if(mState == State.STATE_PROCESSING)
{
// This request is long to do, only do it when processing.
statusTexts[1] = getString(R.string.memory)+String.valueOf(Debug.getNativeHeapAllocatedSize()/(1024*1024));
}
else
{
statusTexts[1] = mStatusTexts[1];
}
}
else
{
statusTexts[1] = mStatusTexts[1];
}
statusTexts[2] = getString(R.string.free_memory)+getFreeMemory();
long memoryFree = getFreeMemory();
statusTexts[1] = getString(R.string.memory)+(mFreeMemoryOnStart>memoryFree?mFreeMemoryOnStart-memoryFree:0);
statusTexts[2] = getString(R.string.free_memory)+memoryFree;
if(loopClosureId > 0)
{
@@ -1240,6 +1223,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
int index = STATUS_TEXTS_POSE_INDEX;
statusTexts[index++] = getString(R.string.nodes)+nodes+" (" + nodesDrawn + " shown)";
statusTexts[index++] = getString(R.string.words)+words;
statusTexts[index++] = getString(R.string.database_size)+databaseMemoryUsed;
statusTexts[index++] = getString(R.string.points)+points;
statusTexts[index++] = getString(R.string.polygons)+polygons;
statusTexts[index++] = getString(R.string.update_time)+(int)(updateTime) + " / " + (mTimeThr.compareTo("0")==0?"No Limit":mTimeThr);
@@ -1254,7 +1238,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
runOnUiThread(new Runnable() {
public void run() {
updateStatsUI(processMemoryUsed, loopClosureId, inliers, matches, rejected, optimizationMaxError, fastMovement!=0, statusTexts);
updateStatsUI(loopClosureId, inliers, matches, rejected, optimizationMaxError, fastMovement!=0, statusTexts);
}
});
}
@@ -1316,8 +1300,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mStatusTexts[0] = getString(R.string.status)+(status == 1 && msg.isEmpty()?(mItemDataRecorderMode!=null&&mItemDataRecorderMode.isChecked()?"Recording":mItemLocalizationMode!=null&&mItemLocalizationMode.isChecked()?"Localization":"Mapping"):msg);
}
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(Debug.getNativeHeapAllocatedSize()/(1024*1024));
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(getFreeMemory());
long freeMemory = getFreeMemory();
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(mFreeMemoryOnStart>freeMemory?mFreeMemoryOnStart-freeMemory:0);
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(freeMemory);
updateStatusTexts();
}
}
@@ -1616,8 +1601,9 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
RTABMapLib.setPausedMapping(true);
mStatusTexts[0] = getString(R.string.status)+"Paused";
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(Debug.getNativeHeapAllocatedSize()/(1024*1024));
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(getFreeMemory());
long freeMemory = getFreeMemory();
mStatusTexts[1] = getString(R.string.memory)+String.valueOf(mFreeMemoryOnStart>freeMemory?mFreeMemoryOnStart-freeMemory:0);
mStatusTexts[2] = getString(R.string.free_memory)+String.valueOf(freeMemory);
updateStatusTexts();
mMapIsEmpty = false;
@@ -1922,6 +1908,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mMapNodes = 0;
mStatusTexts[index++] = getString(R.string.nodes)+0;
mStatusTexts[index++] = getString(R.string.words)+0;
mStatusTexts[index++] = getString(R.string.database_size)+0;
mStatusTexts[index++] = getString(R.string.points)+0;
mStatusTexts[index++] = getString(R.string.polygons)+0;
mStatusTexts[index++] = getString(R.string.update_time)+0;
@@ -1961,6 +1948,7 @@ public class RTABMapActivity extends Activity implements OnClickListener, OnItem
mMapNodes = 0;
mStatusTexts[index++] = getString(R.string.nodes)+0;
mStatusTexts[index++] = getString(R.string.words)+0;
mStatusTexts[index++] = getString(R.string.database_size)+0;
mStatusTexts[index++] = getString(R.string.points)+0;
mStatusTexts[index++] = getString(R.string.polygons)+0;
mStatusTexts[index++] = getString(R.string.update_time)+0;