🦋 Welcome to the MAIN() IRC channel of the Raku Programming Language (raku.org). This channel is logged for the purpose of keeping a history about its development | evalbot usage: 'm: say 3;' or /msg camelia m: ... | Log available at irclogs.raku.org/raku/live.html . If you're a beginner, you can also check out the #raku-beginner channel! Set by lizmat on 8 June 2022. |
|||
00:05
swaggboi joined
00:06
reportable6 left
00:07
reportable6 joined
00:43
morte_ joined
01:43
bloatable6 left,
quotable6 left,
evalable6 left,
sourceable6 left,
releasable6 left,
linkable6 left,
reportable6 left,
unicodable6 left,
notable6 left,
benchable6 left,
tellable6 left,
committable6 left,
greppable6 left,
nativecallable6 left,
bisectable6 left,
shareable6 left,
coverable6 left,
statisfiable6 left
01:44
releasable6 joined,
tellable6 joined,
quotable6 joined,
notable6 joined,
sourceable6 joined
01:45
coverable6 joined,
linkable6 joined,
shareable6 joined,
bloatable6 joined,
benchable6 joined
01:46
bisectable6 joined,
statisfiable6 joined,
greppable6 joined,
nativecallable6 joined,
evalable6 joined,
unicodable6 joined,
committable6 joined
01:47
reportable6 joined
01:53
morte_ left
02:53
notable6 left,
bisectable6 left,
coverable6 left,
tellable6 left,
shareable6 left,
quotable6 left,
sourceable6 left,
benchable6 left,
releasable6 left,
nativecallable6 left,
committable6 left,
unicodable6 left,
evalable6 left,
reportable6 left,
statisfiable6 left,
linkable6 left,
bloatable6 left,
greppable6 left,
coverable6 joined,
bloatable6 joined,
evalable6 joined,
tellable6 joined,
unicodable6 joined,
linkable6 joined,
shareable6 joined,
reportable6 joined
02:54
sourceable6 joined,
bisectable6 joined,
releasable6 joined,
notable6 joined
02:55
benchable6 joined,
greppable6 joined,
committable6 joined,
statisfiable6 joined,
nativecallable6 joined
02:56
quotable6 joined
03:06
frost joined
|
|||
coleman | The Web::Request module; can it be installed with zef? | 03:58 | |
Example usage github.com/Raku/examples/blob/mast...t.raku#L20 | |||
guifa | nine: if `$*W.install_lexical_symbol: $*UNIT…` installs a my-scoped var, how would an our scoped one be installed? | 04:02 | |
04:03
vrurg_ joined
04:04
vrurg left
|
|||
Voldenet | coleman: you may be looking for `zef install Web` | 04:10 | |
guifa | (although if it's not a simple one or two liner, I'll just hold off until RakuAST when I know it'll be much easier lol) | 04:11 | |
04:12
wcs left
|
|||
Voldenet | but the package itself doesn't work for me | 04:12 | |
04:19
_Xliff joined
|
|||
Voldenet | if you need to make requests consider Cro::HTTP | 04:20 | |
or Http::Tiny for the most recent module | |||
04:22
Xliff_ left
05:22
sourceable6 left,
notable6 left,
reportable6 left,
bisectable6 left,
benchable6 left,
coverable6 left,
unicodable6 left,
nativecallable6 left,
statisfiable6 left,
committable6 left,
bloatable6 left,
shareable6 left,
greppable6 left,
quotable6 left,
evalable6 left,
tellable6 left,
linkable6 left,
releasable6 left,
coverable6 joined,
linkable6 joined
05:23
reportable6 joined,
evalable6 joined,
nativecallable6 joined,
benchable6 joined,
sourceable6 joined,
notable6 joined,
shareable6 joined,
quotable6 joined,
greppable6 joined
05:24
releasable6 joined,
bloatable6 joined,
statisfiable6 joined,
bisectable6 joined,
committable6 joined
05:25
unicodable6 joined,
tellable6 joined
06:06
reportable6 left
06:07
reportable6 joined
06:08
daxim left
06:12
irc_user joined
06:39
patrickb left,
patrickb joined
06:46
jaguart joined
06:52
melezhik joined
|
|||
melezhik | . | 06:52 | |
CIAvash: I've setup sparkyci for api sport football module, so if codeberg does not have it's own CI system you can you sparkyci , for example sparrowhub.io:2222/report/825 | 06:55 | ||
From HN I read people move from GH recently ))) | 06:56 | ||
07:03
andm joined
07:06
melezhik left
07:11
melezhik joined
07:12
melezhik left
07:17
abraxxa joined
|
|||
CIAvash | melezhik: Thanks. It has CI, but it's in "closed testing phase" and you have to request early access. | 07:22 | |
tellable6 | CIAvash, I'll pass your message to melezhik | ||
07:24
Madcapjake joined
07:31
abraxxa left,
abraxxa joined
07:36
Sgeo_ left
07:41
mjgardner left
07:42
mjgardner joined,
patterner____ left,
zostay left,
pjlsergeant left,
patterner____ joined,
zostay joined,
pjlsergeant joined
07:56
daxim joined
|
|||
abraxxa | is it a bug, that the raku repl doesn't increment the number shown at the prompt when say is called? | 07:56 | |
tellable6 | 2022-07-06T16:57:24Z #raku <nine> abraxxa: as far as I can tell thats already the case | ||
abraxxa | nine: to what of my questions was this your answer? | ||
07:57
killown joined
|
|||
killown | why should someone give a try for raku and what his language is good for? | 07:57 | |
08:01
dakkar joined
|
|||
abraxxa | killown: for me it's grammars and async/multihtreading | 08:02 | |
wrote a parser for the firehol config syntax which I wouldn't known how to do without grammars | |||
killown | lots os languages can do async and multistuff, but I am interested in this grammars, seems like good for any parser | 08:04 | |
08:05
andm left
|
|||
killown | what about speed, in case I need for example load 5gb log file and parse some stuff from it | 08:06 | |
08:08
sena_kun joined
|
|||
abraxxa | you have to benchmark your use case, but for me runtime performance isn't an argument against using Raku for me | 08:09 | |
killown | always the fastest method is the good one, I am using rust to parse logs, hardware resources matters a lot, but just trying around new languages stuff and you said about grammars, seems interesting depending on the case | 08:13 | |
abraxxa, I am curious, what kind of issue did you have that only grammars could solve it for you | 08:14 | ||
abraxxa | killown: as I already wrote parsing Firehol config files | 08:15 | |
I had a custom Perl syslog parser for our network devices and it was faster than Logstash which I didn't expect | |||
I don't know anything about Rusts regex capabilities, builtin or crate. But as this is old technology the most regex engines are quite well optimized I guess | 08:16 | ||
killown | abraxxa, if the thing is only about regex, even python can do that | 08:18 | |
so raku is just perl with name of raku | 08:19 | ||
ok got it | |||
thank you for all the explanations | 08:20 | ||
abraxxa | no, it's not, which is why it was renamed from Perl 6 to Raku | 08:21 | |
I don't know any other scripting language (compiled on execution) that can do true native multithreading | 08:22 | ||
Perl, Python, PHP, Ruby at least | |||
08:30
andm joined
08:32
irc_user left
|
|||
nine | abraxxa: I meant that as far as I can tell all methods are usually documented | 08:38 | |
abraxxa | nine: of isn't: docs.raku.org/type/Rat | 08:41 | |
nine | guifa: our scoped variables are just entries in the package's stash: | ||
m: my Int $i; module Foo { }; Foo.WHO<$bar> := $i; say $Foo::bar | |||
camelia | (Int) | ||
nine | abraxxa: Rat does not have a method called 'of' | ||
abraxxa | nine: sorry, yes, that was made clear yesterday. What is missing is VAR | 08:42 | |
nine | abraxxa: VAR is not a method. It just looks like one. It's more like a macro and documented in docs.raku.org/language/mop#index-e...ax_VAR-VAR | 08:43 | |
abraxxa | my point is that the documentation should be organized around the human user, not how it is implemented | 08:45 | |
nine | abraxxa: that is certainly a valid point and something every doc author should strive for. I just don't see how it could be done better in this case. To stay with your example: VAR does not have anything to do with the Rat type. Not more than for example 'my'. Would you expect to have 'my' explained on every single type's documentation page? While a little repetition does not hurt (it's the basis of learning | 08:50 | |
after all), too much repetition will cause confusion again, since it makes it harder to find what's actually unique about Rat. | |||
FWIW I am with you that currently the docs probably err a little too much on the side of "don't repeat too much". Raku is a big language and the examples for one feature often require understanding of many other features which a beginner won't necessarily understand yet. | 08:54 | ||
That said, bringing a beginner into the language sounds like something that books are meant for. Of course it could be that people just don't read books anymore :) | 08:55 | ||
abraxxa | nine: the type docs show all methods inherited and I've expected the topmost type Mu to have the VAR method defined and so it shows up in every types' docs | 09:00 | |
for example even after 20+ years in programming I don't know what the term 'macro' means (besides from clusterfuck in Excel) | 09:01 | ||
nine | killown: grammars are not just regexes. They are really the next step in evolution. While some of the things you can do with grammars can actually be done with regexes, you really have to know them extremely well and even then it's tedious. You just know that these advanced features were bolted on. The re-thinking that went into grammars made them much easier to learn. | 09:10 | |
abraxxa: VAR is _not_ a method. Not on Mu, not on anything. | 09:11 | ||
killown | so this is some kind of regex but easier to use advanced stuff | 09:12 | |
abraxxa | nine: maybe, but why would a user care when they call it like one? | ||
thowe | pattern matching in Raku is a leap forward... I was just reading a book on it and playing with some online examples; it is an eyebrow raiser | 09:15 | |
nine | abraxxa: because it's only the "call" that's like a method. You will not find it for example in the results of a call to 'Mu.^methods'. And that's why listing it as a method could even cause more confusion. | 09:19 | |
abraxxa: Int() looks like a call as well. Except that in my Int() $i; it's actually a coercion type and not a call at all. There are just cases where syntax has been re-used and just because something looks similar on a first glance, it is not similar at all. | 09:20 | ||
abraxxa | nine: does a languageserver suggest if for autocompletion? How should a user know that it's available to call? | 09:21 | |
nine | abraxxa: if it's a good language server, it will. If not, then the loss is not huge though. We are talking about a very obscure feature after all. A feature that's probably most useful for introspection. | 09:24 | |
abraxxa: At the end of the day, auto-complete is no susbstitute for really learning a language. If one wants to do advanced stuff (which needing .VAR clearly indicates), one will have to learn the language for real and that will require reading through the "Fundamental topics" section of the docs and not just the reference pages for types. | 09:26 | ||
abraxxa | objecting to documentation improvements won't help to get more users into the language... | 09:27 | |
nine | Who is objecting to improvements? | 09:29 | |
09:32
evalable6 left,
linkable6 left
09:34
evalable6 joined,
linkable6 joined
|
|||
abraxxa | you are by not wanting to list those 'macros' or link to them in the docs | 09:47 | |
and that isn't the first time I'm turned down with docs improvements with some technical argument | |||
nine | If you think I'm making a technical argument (only) then I did not get the message across. | 10:04 | |
10:50 < nine> abraxxa: that is certainly a valid point and something every doc author should strive for. I just don't see how it could be done better in this case. To stay with your example: VAR does not have anything to do with the Rat type. Not more than for example | 10:05 | ||
'my'. Would you expect to have 'my' explained on every single type's documentation page? While a little repetition does not hurt (it's the basis of learning | 10:06 | ||
abraxxa: this ^^^ was the crucial message | |||
abraxxa | is 'my' something than can be called on every type? | ||
nine | Every type can be used with my | 10:08 | |
You can for example use every type as coercion type: Rat(). Should that be documented with every single type? | 10:09 | ||
You can call meta methods on every type: Rat.^name. Should those be documented with every type? | 10:10 | ||
Scimon | I'm trying to get type coercion and binding to play nicely together. It's not going well, can anyone advise? (Example incoming). | 10:17 | |
Using my Tree::Binary class it does and Iterable Role and that's fine. If I bind a variable as a Tree::Binary I can then iterate through it. EG : raku -MTree::Binary -e 'class IntTree does Tree::Binary::Role::BinaryTree[Int] {};my $int-tree := IntTree.from-Str("1(2(3)(4))(3(4)(5))");.say for $int-tree' | 10:19 | ||
That works. | |||
(If I assign it then it doesn't iterate... I *guess* that makes sense). | |||
I also have a COERCE function so I can assign using my IntTree(Str) $int-tree = "1(2)(3)" and *that works* | |||
But my IntTree(Str) $int-tree := "1(2)(3)"... gives me a Str object. | 10:20 | ||
v2022.06 | 10:21 | ||
lizmat | m: my $l = (1,2,3); .say for $l; .say for $l<> # Scimon | 10:22 | |
camelia | (1 2 3) 1 2 3 |
||
lizmat | if it is in a variable, it is containerized. If an Iterable is containerized, it won't iterate with for | ||
decontainerizing with <> is maybe a solution? | 10:23 | ||
Scimon | Ahhhh. | ||
Well that deals with half my confusion. | |||
Yup. Still the Coercion not working on binding feels like a bug. | 10:24 | ||
lizmat | well, I guess either it should work, or you should get a typecheck error ? | 10:25 | |
Scimon | Yeah... and instead it does neither. I may try and make a smaller test case see if I can reproduce. | 10:26 | |
lizmat | m: my Str(Int) $a := 42; dd $a.^name | ||
camelia | "Int" | ||
lizmat | vrurg_ ^^ ?? | ||
m: my Str $a := 42 | 10:27 | ||
camelia | Type check failed in binding; expected Str but got Int (42) in block <unit> at <tmp> line 1 |
||
lizmat | feels worthy of an issue | ||
Scimon | Did I find a bug? | ||
lizmat | feels like to me now :-) | 10:28 | |
Scimon | I'm looking at this code and documenting the bits I'd missed before (like the iteration options). | 10:34 | |
10:34
evalable6 left
10:35
evalable6 joined
11:03
linkable6 left
|
|||
Geth | problem-solving: 18890dc9f4 | (Elizabeth Mattijsen)++ (committed using GitHub Web editor) | solutions/language/Add-head-skip-tail-subs.md Add solution for #328 (#329) github.com/rakudo/rakudo/commit/af31b1df89 made this change. |
11:04 | |
11:06
linkable6 joined
|
|||
guifa | nine: forgive my ignorant Q, but how would I add an entry to a package stash via action code? Just switch $*UNIT to $*PACKAGE ? | 11:12 | |
11:25
jaguart left
|
|||
nine | guifa: oh, in actions. Sorry, I missed that context. Look into $*W.install_lexical_container. It takes a :scope. But really....this sounds like bad timing for fiddling in that stuff. This is really what RakuAST is making so much easier it's not even funny. | 11:29 | |
So if at all possible, I'd suggest working with the rakuast branch instead. | |||
guifa | nine: yeah I know :-) I finally have gotten the hang of slangs, but I'm in the really awkward middle phase where it's super easy to generate the code with RakuAST, but things still need to be installed via $*W to be usable in the slang :-) | 11:30 | |
_Xliff | nine: I want to emit a set of need statements into a given lexical scope. Does the existing set of macros allow for that or will I need to test with RakuAST? | ||
Right now, if I use "macro A { quasi { need B; Need C; Need D } };" the compunits are not cvisible to the scope that called A. | 11:31 | ||
: use experimental :macros; macro A { quasi { need NativeCall; NativeCall::CArray[uint32].^name.say }; }; sub a { A; NativeCall::CArray[uint32].^name.say }; a | 11:36 | ||
m: use experimental :macros; macro A { quasi { need NativeCall; NativeCall::CArray[uint32].^name.say }; }; sub a { A; NativeCall::CArray[uint32].^name.say }; a | 11:37 | ||
camelia | No such method 'AT-KEY' for invocant of type 'VMNull' in any at <tmp> line 1 in sub a at <tmp> line 1 in block <unit> at <tmp> line 1 |
||
_Xliff | ^^ Oh, and there's that... | ||
12:07
reportable6 left
12:09
reportable6 joined
12:22
frost left
12:29
melezhik joined,
melezhik left
12:30
melezhik joined
12:35
melezhik left
12:43
dakkar left,
dakkar joined
13:04
lizmat left,
RakuIRCLogger left
13:05
Geth left,
lizmat joined
13:13
jaguart joined
13:25
lizmat left
13:26
lizmat joined
13:36
killown left
13:54
killown joined
13:55
vodkra left
14:00
vodkra joined
14:02
morte_ joined
14:07
Sgeo joined
14:16
Geth joined
14:22
Geth left,
Geth joined
14:35
p6steve joined
|
|||
p6steve | raku | 14:36 | |
lizmat | you're damn right! | 14:37 | |
p6steve | -m 'Nan.^name' | ||
-m Nan.^name | |||
m: Nan.^name | 14:40 | ||
camelia | ===SORRY!=== Error while compiling <tmp> Undeclared name: Nan used at line 1 |
||
p6steve | m: NaN.^name | ||
camelia | ( no output ) | ||
p6steve | m: say NaN.^name | ||
camelia | Num | ||
p6steve | phew | ||
M: say "".^name | |||
m: say "".^name | |||
camelia | Str | ||
p6steve | so both Num and Str have a "none" value of their type | 14:41 | |
does Int have similar? | 14:42 | ||
Nemokosch | Every type does, no? | 14:43 | |
p6steve | I am trying to use something more concrete than (Int) | 14:44 | |
as in "its defined to be 'none'" | 14:45 | ||
guess I will have to go with (Int) anyways since I want | 14:48 | ||
m: (1,2,3).are | |||
camelia | ( no output ) | ||
lizmat | m: dd (1,2,3).are | ||
camelia | Int | ||
p6steve | m: dd (1,2,3,(Int)).are | 14:49 | |
camelia | Int | ||
p6steve | tx | ||
m: <a b c>.are | 14:50 | ||
camelia | ( no output ) | ||
p6steve | m: dd <a b c>.are | ||
camelia | Str | ||
p6steve | m: dd <a b c (Str)>.are | ||
camelia | Str | ||
p6steve | and so on | ||
m: dd (1.0, NaN).are | 14:53 | ||
camelia | Real | ||
p6steve | m: dd (1e0, NaN).are | ||
camelia | Num | ||
p6steve | m: dd (1e0, NaN, (Num)).are | ||
camelia | Num | ||
jaguart | Whats the diff between .WHAT and .^name? | 15:02 | |
nine | What gives the type object, name gives the type's name | ||
jaguart | ummm | 15:03 | |
p6steve | I heard that .^name is to be preferred, not sure why | ||
jaguart | ok - makes sense, when I `say 0.WHAT` it stringify's the class into its name? | 15:04 | |
nine | yes | 15:05 | |
p6steve | m: say 0.^name.^methods | 15:06 | |
camelia | (BUILD Capture COERCE Int Num Version pred succ match subst-mutate parse-base Date DateTime IO WHY WHICH Bool Str Stringy DUMP ACCEPTS chomp chop starts-with ends-with substr-eq contains indices index rindex Numeric gist raku comb subst lines split sa… | ||
p6steve | .^name seems to give you more than just a Str | ||
m: say 0.^name.^name | 15:07 | ||
camelia | Str | ||
p6steve | OK - that's cool | ||
jaguart | where in docs can I find details on .are - it's hard to search for :/ | 15:09 | |
15:09
irc_user joined
|
|||
Nemokosch | What even is it | 15:14 | |
jaguart | looks like it's a List thingy that tells you about the List content type | 15:15 | |
m: say (1,2,3).are | |||
camelia | (Int) | ||
jaguart | m: say (1,2,'a').are | ||
camelia | (Cool) | ||
jaguart | m: say (1.0,0.2).are | 15:16 | |
camelia | (Rat) | ||
nine | Method are is a recent addition (only introduced this year) that's not yet documented | 15:19 | |
p6steve | .are returns the narrowest type that all items match | 15:21 | |
(guess it only applies to built in types??) | 15:23 | ||
generally that is types that have ancestor Cool | |||
docs.raku.org/type/Cool#Type_Graph | 15:24 | ||
m: say ((Map),(Range)).are | 15:25 | ||
camelia | (Iterable) | ||
jaguart | oh that is nice :) | ||
p6steve | m: class Kid{}; my Kid $john; my Kid $anna; say ($anna,$john).are; | 15:29 | |
camelia | (Kid) | ||
p6steve | nope applies to stuff youmake too | ||
nine | I think it would actually have been more difficult to restrict it to builtin types... | 15:30 | |
jaguart | Hmm a lot of `Died with X::Method::NotFound` | 15:32 | |
m: say (1,2,3.0).are | |||
camelia | (Real) | ||
jaguart | Oh interesting - that `Died with X::Method::NotFound` in my REPL... | 15:33 | |
and works after restart | |||
15:36
wcs joined
|
|||
jaguart | m: say ((Map),(Iterable)).are | 15:38 | |
camelia | (Iterable) | ||
jaguart | m: say ((Iterable),(Map)).are | ||
camelia | No such method 'mro' for invocant of type 'Perl6::Metamodel::ParametricRoleGroupHOW' in block <unit> at <tmp> line 1 |
||
jaguart | m: say ((Map),(Iterable)).are | 15:39 | |
camelia | (Iterable) | ||
15:42
morte_ left
15:45
morte_ joined
|
|||
nine | jaguart: why do you use those extra parentheses there? | 15:47 | |
15:47
abraxxa left
|
|||
nine | m: say (Map, Iterable).are | 15:47 | |
camelia | (Iterable) | ||
15:48
melezhik joined
|
|||
melezhik | . | 15:48 | |
tellable6 | 2022-07-07T07:22:55Z #raku <CIAvash> melezhik: Thanks. It has CI, but it's in "closed testing phase" and you have to request early access. | ||
melezhik | lizmat: Probably you're seen, just decided to tell just in case - I created a couple of GH issues for your modules test failures on sparkyci, hopefully helpful | 15:49 | |
you're -> you've | 15:50 | ||
15:50
morte_ left
15:51
morte_ joined
15:55
melezhik left
16:22
morte_ left
16:32
dakkar left
16:59
guifa left
|
|||
[Coke] | github.com/Raku/doc/issues/4034 (the ticket for documenting .are) | 16:59 | |
(extra parens) you're outputting a type object, not a string. that's how the type object stringifies. | |||
m: dd (Map, Iterable).are | |||
camelia | Iterable | ||
[Coke] | m: dd (Map, Iterable).are.^WHAT | 17:00 | |
camelia | ===SORRY!=== Error while compiling <tmp> Cannot use .^ on a non-identifier method call at <tmp>:1 ------> dd (Map, Iterable).are.^WHAT⏏<EOL> expecting any of: method arguments |
||
[Coke] | m: (Map, Iterable).are.new.^WHAT.say | ||
camelia | ===SORRY!=== Error while compiling <tmp> Cannot use .^ on a non-identifier method call at <tmp>:1 ------> (Map, Iterable).are.new.^WHAT⏏.say expecting any of: method arguments |
||
[Coke] | oof. | ||
m: dd (Map, Iterable).are.WHAT | 17:02 | ||
camelia | Iterable | ||
[Coke] | I was conflating ^name and WHAT. :) | 17:04 | |
`cal`to emit this month's calendar: 0.01s; raku to run 'say now': .7s | 17:42 | ||
Guessing it's not worth trying to do any optimizations on App::Cal. :) | 17:48 | ||
17:50
jaguart left
17:59
Sankalp joined
18:07
reportable6 left
18:09
reportable6 joined
18:20
jaguart joined
|
|||
jaguart | Coke: thanks for the correction - just assumed I needed the extra parens | 18:25 | |
japhb | [Coke]: What kind of system has raku getting a .7s startup time? | 18:26 | |
(FWIW, it's less than .2s on my heavily loaded several-year-old laptop) | 18:27 | ||
lizmat | my 10+ year old MacMini it's .218 seconds | ||
(running Debian) | |||
on the 2 year old MacMini with an M1: .11 | 18:28 | ||
[Coke] | my 2014 mac mini | 18:42 | |
it's .179 for -e1; | 18:43 | ||
... numbers I'm seeing now are much faster. wtf? | 18:44 | ||
might have had something running in the bg. | |||
18:57
peder left
19:00
peder joined
19:01
peder_ joined
19:02
swaggboi left
|
|||
Anton Antonov | I am looking for (much) faster alternative of "Text::CSV" -- any suggestions. (I should be able to easily run it on macOS.) | 19:05 | |
I am looking for (much) faster alternative of "Text::CSV" -- any suggestions? (I should be able to easily run it on macOS.) | 19:06 | ||
[Coke] | Not unless you're willing to cheat and not follow the spec. | ||
text::csv is commonly used as a performance canary to ensure rakudo isn't slowing down; it's implemented by the author of perl5's version of the module. You're not going to find another implementation that's as accurate. | 19:07 | ||
Anton Antonov | @Coke Haha, ok. I tried cheating and failed... | ||
Ok, good to know! (Almost all my packages use "Text::CSV" for resource data ingestion.) | 19:08 | ||
[Coke] | You could try Inline::Perl5 and perl5's version of Text::CSV - I believe that is reported as slightly faster. | ||
yah, whenver I write something that needs CSV, if I try to cheat, I have to pull in T::CSV not long after. Have learned to just embrace it for consumption. | 19:09 | ||
lizmat | the Perl version of Text::CSV is about 6x faster, I believe | 19:10 | |
[Coke] | even when used via rakudo? | 19:11 | |
lizmat | ah... hmmm... possibly, :-) | ||
Anton Antonov | @lizmat 6 times faster motivates me to try it. | ||
lizmat | Anton Antonov: please let us know what you find! | 19:12 | |
Anton Antonov | Will do -- it is a "real life" project with production level data. I trying to evaluate my Raku-implemented recommender over some of the data. | 19:13 | |
lizmat | cool! | 19:14 | |
Anton Antonov | BTW, my Raku implementation is a "reference implementation" -- it has all the features needed for most recommendations workflows and it is based on Mix objects. Usually, after ingesting the data works fast enough. | 19:16 | |
19:20
swaggboi joined
19:28
irc_user left
|
|||
japhb | .oO( Transcode from CSV to CBOR using whatever's the fastest transcoder you can find, then use CBOR::Simple for loading the transcoded data ) |
19:32 | |
19:37
vrurg_ is now known as vrurg
|
|||
Anton Antonov | @japhb Great suggestion! I will try it out today. | 19:39 | |
@japhb "Transcode[r] from CSV to CBOR" -- Any suggestions? | 19:42 | ||
19:46
Madcapjake left
|
|||
japhb | Thinking. | 19:48 | |
Is the CSV you're loading mixed text and numbers, or just pure numbers, or pure text? | |||
19:50
sena_kun left
|
|||
p6steve | japhb: there lies the problem ;-) | 19:51 | |
japhb | p6steve: That you don't know? Or that it is mixed and weird? | 19:52 | |
19:53
sena_kun joined
|
|||
japhb | Hmmm, I'm seeing various premade JSON <-> CBOR transcoders, but not off the shelf for CSV. Actually, I wonder if having a pure-perl5 process that uses one of the faster CSV modules to load, then e.g. CBOR::XS or CBOR::Free to write, would be a fast enough transcoder. | 19:55 | |
p6steve | btw you can use Dan::Pandas; my \df .= DataFrame.new; df.pd: '.read_csv("test.csv")'; | 19:57 | |
japhb | Looks like Text::CSV_XS is the fast one on the Perl 5 side. | 19:58 | |
p6steve | japhb: sorry - just reflecting that CSV slowness is because usually you don't know what's out there | 19:59 | |
japhb | p6steve: Oh sure, I was just meaning, if you *happened* to know what the data sets roughly looked like, there are different ways you can do the transcode to speed things up. For example, CBOR has the concept of packed arrays ... if what you've got in each row is for instance all numbers, or a couple text fields and then a lot of numeric fields, you can take advantage of packed arrays to get much smaller and | 20:01 | |
faster. | |||
Anton Antonov | I am trying to use Python package called "cbor2" right now. | ||
japhb | Let us know how it goes! :-) | ||
Anton Antonov | 🤞 | 20:03 | |
p6steve | anton: IMO Inline::Python is OK for light use ... but I'm wary of pycall for heavy lifting | 20:04 | |
anton: I'm knee deep right now in Rust/Polars (thus this non-module github.com/p6steve/raku-Inline-Rust) | 20:05 | ||
anton: would that help? | 20:09 | ||
Anton Antonov | <@928301352029937715> I was never able to install "Inline::Python" on my mac. | ||
<@928301352029937715> Doing it with Rust !? 🙂 I am not sure. | 20:10 | ||
p6steve | container-service-1.gs7k0bfrb4gvk....r/eg?reset | ||
password 'p6steve' | |||
Anton Antonov | Sounds good, thanks! Will try it in the next 30 min. | 20:11 | |
p6steve | anton: please do have a play on the Jupyter - IMO Rust/Polars is the best engine (ie. no Python) | 20:12 | |
20:14
MadcapJake joined
|
|||
p6steve | gnight | 20:16 | |
ah - need to restart lightsail ... | 20:21 | ||
Anton Antonov | Ok -- will do. | 20:22 | |
p6steve | anton: new url -> container-service-1.gs7k0bfrb4gvk....tsail.com/ | 20:26 | |
anton: password 'p6steve' | 20:27 | ||
Anton Antonov | <@928301352029937715>, Do I have to have an account at amazonlightsail? | 20:30 | |
@japhb I got a CBOR file -- how do I read it in Raku? Using `slurp` with ":bin" ? | 20:37 | ||
@japhp Yeah, I got it working. And, yes, the CBOR utilization gives me the fastest ingestion of ≈700MB CSV file in Raku. | 20:49 | ||
20:54
andm left
21:12
jaguart left
|
|||
nine | [Coke]: according to the daily test runs, Text::CSV_XS via Inline::Perl5 is about 4x faster than Text::CSV. The valid comparison is csv-ip5xs-20 vs. test-t-20. The versions with fewer iterations are mostly comparing startup overhead. The --race version can't be compared because the benchmark doesn't include a threaded version using Inline::Perl5. | 21:14 | |
21:15
swaggboi left
21:26
swaggboi joined
21:28
wcs left
21:57
Colere left
22:29
sena_kun left
|
|||
japhb | Antonov: \o/ | 22:44 | |
Glad to hear that. :-) | |||
23:12
MadcapJake left
23:13
_Xliff left,
Xliff left
23:21
wcs joined
23:32
Colere joined
23:36
perlbot left
23:37
simcop2387 left,
swaggboi left
23:38
swaggboi joined
23:58
perlbot joined
23:59
simcop2387 joined
|