I get memory usage of 1.2GB actually after mesh.init().

mesh.init(2,3) consumes roughly the same as DirichletBC.


-Øyvind


2014/1/8 Mikael Mortensen <[email protected]>

>
> Den Jan 8, 2014 kl. 1:00 PM skrev Martin Sandve Alnæs:
>
> You can call mesh.init explicitly in your code to measure them separately?
>
>
> Yes, just did. I replaced the DirichletBC lines in the script by
> mesh.init() and re-ran. For me a full mesh.init() leads to memory
> consumption of 1053900 KB, or 1 GB! Compared to the Laplacian matrix of 8
> MB. Is this reproducible?
>
> M
>
>
>
> Martin
>
>
> On 8 January 2014 12:43, Mikael Mortensen <[email protected]> wrote:
>
>> Hi,
>>
>> I am currently comparing a fenics based solver to some other open source
>> Navier-Stokes solvers and I just realized that I was using much more
>> memory, perhaps as much as a factor 3. I always thought it was the
>> matrices, vectors and Krylov solvers that were consuming memory, but on
>> inspection I see that memory is totally dominated by the boundary
>> conditions (mesh connectivity?). This was quite surprising to me, so I
>> guess my question is - is this a well known issue?
>>
>> I have made a small test for memory use of a Poisson solver to
>> illustrate. Running it on one cpu returns the table showing the increment
>> in RSS memory use and total memory use for each new function down the
>> script.
>>
>> In [1]: run memorytest.py
>>                      RSS memory Increment       Total
>> Starting weight of dolfin        75988 KB      75988 KB
>> Mesh                             16760 KB      92748 KB
>> FunctionSpace                    41600 KB     134348 KB
>> Matrix assembly                   7792 KB     142140 KB
>> Function                           304 KB     142444 KB
>> Solve                              868 KB     143312 KB
>> Boundary condition              321428 KB     464740 KB
>> New solve                            0 KB     464740 KB
>>
>> Creating and applying the Dirichlet boundary condition calls mesh.init(D)
>> and mesh.init(D-1, D). I think this is were the extra memory comes in. The
>> memory cost is nearly 5 times more than for all the other stuff! Any
>> comments?
>>
>> Mikael
>>
>>
>>
>> from dolfin import *
>> from commands import getoutput
>> from os import getpid
>> set_log_active(False)
>>
>> def getRSSMemoryUsage():
>>     mypid = getpid()
>>     return eval(getoutput("ps -o rss %s" % mypid).split()[1])
>>
>> class MemoryUsage:
>>     def __init__(self, s):
>>         self.memory = 0
>>         info_blue(' '*21+'RSS memory Increment       Total')
>>         self(s)
>>
>>     def __call__(self, s):
>>         self.prev = self.memory
>>         self.memory = getRSSMemoryUsage()
>>         #self.memory = memory_usage(False)[0]
>>         info_blue('{0:26s}  {1:10d} KB {2:10d} KB'.format(s,
>>                    self.memory-self.prev, self.memory))
>>
>> memoryusage = MemoryUsage('Starting weight of dolfin')
>>
>> mesh = UnitCubeMesh(40, 40, 40)
>>
>> memoryusage("Mesh")
>>
>> V = FunctionSpace(mesh, 'CG', 1)
>>
>> memoryusage('FunctionSpace')
>>
>> u, v = TrialFunction(V), TestFunction(V)
>> A = assemble(inner(grad(u), grad(v))*dx)
>>
>> memoryusage("Matrix assembly")
>>
>> b = assemble(Constant(6)*v*dx)
>> u = Function(V)
>>
>> memoryusage("Function")
>>
>> solve(A, u.vector(), b, 'gmres', 'hypre_amg')
>>
>> memoryusage('Solve')
>>
>> bc = DirichletBC(V, Constant(0), DomainBoundary())
>> bc.apply(A, b)
>>
>> memoryusage('Boundary condition')
>>
>> solve(A, u.vector(), b, 'gmres', 'hypre_amg')
>>
>> memoryusage('New solve')
>>
>> _______________________________________________
>> fenics mailing list
>> [email protected]
>> http://fenicsproject.org/mailman/listinfo/fenics
>>
>
>
>
> _______________________________________________
> fenics mailing list
> [email protected]
> http://fenicsproject.org/mailman/listinfo/fenics
>
>
_______________________________________________
fenics mailing list
[email protected]
http://fenicsproject.org/mailman/listinfo/fenics

Reply via email to