ducdh1210 / labstreaminglayer

Automatically exported from code.google.com/p/labstreaminglayer
0 stars 0 forks source link

Memory leak in pull_chunk #20

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
What steps will reproduce the problem?

Run this server code, it creates two outlets, one for EEG and one for Marker. 
It randomly populates the EEG outlet, but never touches the Marker outlet.

import random
import time

import pylsl

if __name__ == '__main__':

    info = pylsl.StreamInfo('Test', 'EEG', 8, 100, 'float32', 'myUID')
    data_outlet = pylsl.StreamOutlet(info, 32, 360)

    info = pylsl.StreamInfo('Test', 'Markers', 1, 0, 'string', 'muuid2')
    marker_outlet = pylsl.StreamOutlet(info)

    i = 0
    while True:
        sample = [random.random() for i in range(8)]
        data_outlet.push_sample(sample)
        if i % 10 == 0:
            i = 0
        time.sleep(0.01)

On the client side:

import pylsl
stream = pylsl.resolve_stream('type', 'Markers')
m_inlet = pylsl.StreamInlet(stream[0])
for i in range(10000): m_inlet.pull_chunk(timeout=0)

What is the expected output? What do you see instead?

No increase in memory usage of process. I see 4MB more when ever I call this 
loop.

What version of the product are you using? On what operating system?

Latest from HG.

Please provide any additional information below.

Original issue reported on code.google.com by bastian....@gmail.com on 15 Aug 2014 at 1:36

GoogleCodeExporter commented 8 years ago
I should mention, that the memory leak happens in the client process.

I also found a hint to the problem. If you change the type of the Outlet to 
float32, everything works as expected, so the problem seems to be related to 
the string type.

Original comment by bastian....@gmail.com on 15 Aug 2014 at 2:07

GoogleCodeExporter commented 8 years ago
Same Problem here using the c# wrapper!

Original comment by martin.s...@googlemail.com on 17 Mar 2015 at 12:16

GoogleCodeExporter commented 8 years ago
The reason seems to be obvious -- lsl_pull_chunk_str() calls malloc() for each 
string it returns.  There's no easy way to call free() from C# (nor from 
Python, I assume), so an additional C function, e.g. "lsl_chunk_str_free(char 
**data_buffer, double *timestamp_buffer, unsigned long data_buffer_elements, 
unsigned long data_buffer_row_elements)", would have to be written to call 
free() in a 2-level loop.

Original comment by ulat...@yahoo.com on 1 Jun 2015 at 7:48

GoogleCodeExporter commented 8 years ago
Thanks for posting this. Can you please copy the post and re-post it on our 
github page (https://github.com/sccn/labstreaminglayer/issues)? We are trying 
to migrate there and it would be great if we could keep these issues once 
google code shuts down.

Original comment by david.er...@gmail.com on 1 Jun 2015 at 7:57