Closed Green7 closed 7 years ago
Hi, what is the average size of the data in bytes? The readable buffer internally has reference counting, it can be exposed to retain without copying.
Averge size depends on several factors (compression, user activity etc.) but in current solution in some cases we sending data in 150 KB chunks. (and I need this full 150 KB chunk to process it).
How to use ReadableBuffer without coping ?
In this case, I think the readable buffer needs to expose increment reference count and you can get hold of the bytes without copying. I have to add some new methods into the readable buffer.
I have added a method in ReadableBuffer
public void ReadBytes(Action<ArraySegment
Do you think this would be enough for your processing chunks?
I my case, I need to calculate some aggregation of the buffer e.g. md5 without copy out the data, this callback syntax is not very convenient to use. Since the underlying buffer of ReadableBuffer is reference counted, it's guarenteed not being recycled before the end of stream consumer function. I don't see the point of using a callback.
I am trying to avoid returning buffer since the underlying buffer might not be a heap array, it could be unmanaged memory.
I have added a method in ReadableBuffer public void ReadBytes(Action
processor, int length) so that you don't have to copy data out to process. Do you think this would be enough for your processing chunks?
I think it should. But now I do not use NetUv. There are two reasons: first: https://github.com/StormHub/NetUV/issues/55 Because I cant have client and server in this same application its impossible to do unit tests etc. I tried System.IO.Pipelines.Networking.Libuv and this problem does not exist there. Second (worst): Our application must work on Windows XP. So we cant use net standard :( Its hard to port NetUv to NetFramework 4, standard Net sockets are to slow for us. We are still looking for a solution to this problem ....
Kestrel does the thread marshalling. Windows XP support is quite a stretch.
I'm trying to apply NetUV in my project. I am sending large amounts of data and I need entire data to process them.
Now I handle data in OnRead(StreamHandle streamHandle, ReadableBuffer data) event but in ReadableBuffer data is (of course) chunked. What is the best and most effective "NetUV" way to collect this data and process them ?
For example: I want to get and process 10 000 bytes. Now I'm using ReadableBuffer.ReadBytes, read current portion of data to temporary array and copy them to my big array allocated before. But in this situation I have a lot of unnecessary operations. How to do it better ?