| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
August 07, 2015 std.parallelism taskPool.map example throws exception | ||||
|---|---|---|---|---|
| ||||
I tried to create a working example from the std.parallelism taskPool.map code, and it throws with empty strings with length 1 being passed to to!double. Anyone have a working example? I'm building on Windows with 2.067.1 dmd.
import std.parallelism;
import std.algorithm;
import std.stdio;
import std.conv;
import std.math;
import std.range;
import std.file;
void main()
{
auto fn = "numberList.txt";
auto f = File(fn,"w");
scope(exit) std.file.remove(fn);
foreach (i ; iota(10.0,2_000.0)){
f.writefln("%g",i+0.5);
}
f.close();
auto lineRange = File(fn).byLine();
auto dupedLines = std.algorithm.map!"a.idup"(lineRange);
auto nums = taskPool.map!(to!double)(dupedLines);
auto logs = taskPool.map!log10(nums);
double sum = 0;
foreach(elem; logs)
{
sum += elem;
}
writeln("sum=",sum);
}
| ||||
August 08, 2015 Re: std.parallelism taskPool.map example throws exception | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jay Norwood | This appears to work ... at least, no exception: auto sm = File(fn).byLine(KeepTerminator.no) .map!"a.chomp"() .map!"a.idup"() .map!(to!double) .map!"a.log10"() .sum(); writeln("sum=",sm); | |||
August 08, 2015 Re: std.parallelism taskPool.map example throws exception | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jay Norwood | This also works.
auto sm = File(fn).byLineCopy()
.map!"a.chomp"()
.map!(to!double)
.map!"a.log10"()
.sum();
writeln("sum=",sm);
| |||
August 08, 2015 Re: std.parallelism taskPool.map example throws exception | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jay Norwood | and, finally, this works using the taskPool.map, as in the std.parallelism example. So, the trick appears to be that the call to chomp is needed. auto lineRange = File(fn).byLineCopy(); auto chomped = std.algorithm.map!"a.chomp"(lineRange); auto nums = taskPool.map!(to!double)(chomped); auto logs = taskPool.map!log10(nums); double sum = 0; foreach(elem; logs) { sum += elem; } writeln("sum=",sum); | |||
August 08, 2015 Re: std.parallelism taskPool.map example throws exception | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jay Norwood | Unfortunately, this is not a very good example for std.parallelism, since the measured times are better using the std.algorithm.map calls. I know from past experience that std.parallelism routines can work well when the work is spread out correctly, so this example could be improved.
This is parallel
D:\visd\map\map\Release>map
sum=1.17335e+07
time msecs:1242
Non-parallel
D:\visd\map\map\Release>map
sum=1.17335e+07
time msecs:970
I think this example
import std.parallelism;
import std.algorithm;
import std.stdio;
import std.conv;
import std.math;
import std.range;
import std.file;
import std.datetime;
void main()
{
auto fn = "numberList.txt";
auto f = File(fn,"w");
scope(exit) std.file.remove(fn);
foreach (i ; iota(10.0,2_000_000.0)){
f.writefln("%g",i+0.5);
}
f.close();
std.datetime.StopWatch sw;
sw.start();
auto lineRange = File(fn).byLineCopy();
auto chomped = std.algorithm.map!"a.chomp"(lineRange);
auto nums = std.algorithm.map!(to!double)(chomped);
auto logs = std.algorithm.map!log10(nums);
double sum = 0;
foreach(elem; logs)
{
sum += elem;
}
long tm = sw.peek().msecs;
writeln("sum=",sum);
writeln("time msecs:", tm);
}
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply