On Friday, 8 November 2019 at 01:12:37 UTC, Ali Çehreli wrote:
On 11/07/2019 07:07 AM, bioinfornatics wrote:
> Dear,
>
> I try to use the async buffer describe into std.parallelism
> documentation but my test code core dump!
I admit I don't fully understand the lifetime issues but
removing the "code smell" of the modul-level File object solved
the issue for me, which requires four changes:
// (1) Comment out the module-level variable
// File file;
// ...
@system
void next(File file, ref ubyte[] buf)
{
// (2.a) Use the parameter 'file'
// (2.b) Adjust the length of the buffer
// (rawRead may read less than the requested size)
buf = file.rawRead(buf);
}
// ...
// (3) Define a local variable
auto file = File(filePath, "rb");
// ...
// (4) Use "callables" that use the local 'file':
auto asyncReader = taskPool.asyncBuf((ref ubyte[] buf) =>
next(file, buf),
() => file.eof,
bufferSize);
Ali
Thanks a lot Ali, the error message was understandable to me, and
the way you fixed differ from the documentation. Does that means
they are a bug ?
Moreover, this snippet is used to evaluate how to parse
efficiently versus the wc -l command.
fixed snippet:
https://paste.fedoraproject.org/paste/B~PjobIlVXIaJPfMjCcWSA
And I have 2 problems
1/ the executable is at least twice a time slower than wc -l
I try to increase
a) the buffer with a multiple of page size (parameter -n)
b) the number of thread (parameter -t)
2/ the result is not exactly the same as wc -l give wich imply a
bug while counting \n inside the buffer.
$ time ./build/wc_File_by_chunks_async_buffer -n 4 -t 8 -i
test_100M
1638656 test_100M
real 0m0.106s
user 0m0.101s
sys 0m0.051s
$ time wc -l test_100M
1638400 test_100M
real 0m0.067s
user 0m0.030s
sys 0m0.037s
Thanks again Ali without you It was impossible to me