2016-09-30 2 views
0

Согласно этому ответу (https://groups.google.com/forum/#!msg/torch7/rmIcBYCiFG8/IC68Xzd3DgAJ), кажется, что факел автоматически освобождает тензор, который больше не используется. И у меня уже была эта проблема - тензорный указатель, который автоматически освобождается lua, вызывая segfault в c-программе. Однако из моих экспериментов кажется, что не ручное вызов кода на C приводит к утечке памяти, где память программы постоянно увеличивается.Содержит ли lua мусор тензоры факела, выдвинутые из C?

Вот мой тестовый код:

#include <iostream> 
#include <chrono> 
#include <thread> 

#include <lua.hpp> 
extern "C" { 
#include <TH.h> 
#include <luaT.h> 
} 

using namespace std; 

int main(int argc, char** argv) 
{ 
    lua_State* L = luaL_newstate(); 

    luaL_openlibs(L); 

    lua_getglobal(L, "require"); 
    lua_pushstring(L, "torch"); 
    lua_pcall(L,1,0,0); // require "torch" 

    int h=224, w=224, nb_channel=3; 

    int len = h * w * nb_channel; 
    long stride_1 = h * w; 
    long stride_2 = w; 
    long stride_3 = 1; 

    for (size_t i = 0 ; i < 1000000 ; ++i) 
    { 
     float *tensorData = (float*)malloc(sizeof(float)*len); // Should be when the storage is freed 
     THFloatStorage *storage = THFloatStorage_newWithData(tensorData, len); // Memory released when tensor input is freed by lua garbadge collector 
     THFloatTensor* input = THFloatTensor_newWithStorage3d(storage, 
                   0, // Offset 
                   nb_channel, stride_1, // Channels 
                   h,   stride_2, // Height 
                   w,   stride_3); // Width 
     // Do some initialisation of the tensor... 

     luaT_pushudata(L, (void*) input, "torch.FloatTensor"); // Send the tensor to lua 
     // Do some stuff with the input... (call lua torch scripts...) 
     lua_pop(L, 1); 

     // If those two lines is not set, we get a memory leak 
     THFloatTensor_free(input); // Will sometimes create a segfault as the tensor seems to be deleted by the lua garbadge collector 
     THFloatStorage_free(storage); 

     if (i%10000 == 0) 
      std::cout << i << std::endl; 
     std::this_thread::sleep_for(std::chrono::microseconds(1)); 
    } 



    return 0; 
} 

Как правильно управлять памятью с C и Lua, чтобы избежать Segfault без утечек памяти?

+0

Это не код C. – Olaf

+0

Я знаю, но проблема связана с библиотеками c (luaT.h, lua.h). Части cpp примера не связаны с проблемой. – Conchylicultor

ответ

0

Я думаю, вы получаете утечку памяти из-за не освобождения памяти для «tensordata» в этой строке поплавок tensorData = (поплавок) таНос (SizeOf (флоат) * длина);

Надеюсь, это поможет

+0

Эта память обессолена при освобождении THFloatStorage: https://github.com/torch/torch7/blob/master/lib/TH/generic/THStorage.c#L120 Проблема в том, что она создает конфликт с сборщиком lua garbadge, который также удалить тензор (удалить дважды == неприятности), создав segfault. – Conchylicultor

Смежные вопросы