簡単なことが好き
状況
私のケース21 MBで大きなJSONファイルがあります.このファイルをメモリからサーバーデータに読み込むことができます.ニースシンプルな権利?確かに最初のデータを読むことが数秒かかるかもしれないが、その後、サービスだけでtrundleすることができます.
以下に簡単な例を示しますCro .
use JSON::Fast;
use Cro::HTTP::Router;
use Cro::HTTP::Server;
constant DATAFILE = 'data.json';
my $data = from-json($data)
my $application = route {
get -> 'count' {
content 'text/plain', "{$data.keys.elems}\n";
}
get -> 'keys' {
content 'text/plain', "{$data.keys.join(",")}\n";
}
get -> $uid {
not-found unless $data{$uid}:exists;
content 'text/plain', "{$data{$uid}.keys.join(",")}\n";
}
get -> $uid, $cid {
not-found unless ($data{$uid}:exists) && ($data{$uid}{$cid}:exists);
content 'text/plain', "{$data{$uid}{$cid}}\n";
}
}
my Cro::Service $server = Cro::HTTP::Server.new:
:host<localhost>, :port<5000>, :$application;
$server.start;
react whenever signal(SIGINT) {
$server.stop;
exit;
}
(このほとんどはcro docsから正直であるように言われています)$data
が最初に読み込まれ、スレッド間で共有されます.( 2つのレベルのデータ構造であることに注意してください.データは不変です、そして、すべてはすばらしいです.皺
時々、データファイルは更新されます.これが起こるとき、我々は我々が適用する必要がある規則の束を持っています:
解決策
それは解決策ではないかもしれませんが、他の人とコメントするのは自由ですが、ここに私が思い付いたものです.
unit class JSONDataWatcher;
use JSON::Fast;
subset DataFilePath of Str:D where *.IO:e && *.IO.f;
has DataFilePath $!datafile;
has $.data;
has Lock $!lock;
method !update-data {
my $read;
try {
$read = from-json( $!datafile.IO.slurp );
}
$!lock.protect( {$!data = $read} ) unless $!;
}
submethod BUILD( DataFilePath:D :$!datafile ) {
$!lock = Lock.new();
self!update-data();
start react {
whenever $!datafile.IO.watch() {
self!update-data();
}
}
}
JsonDataWatcherクラスがありました.あなたはファイルパスを与えます、そして、それは2、3のものをします:use JSONDataWatcher;
use Cro::HTTP::Router;
use Cro::HTTP::Server;
constant DATAFILE = 'data.json';
my $w = JSONDataWatcher( datafile => DATAFILE );
my $application = route {
get -> 'count' {
content 'text/plain', "{$w.data.keys.elems}\n";
}
get -> 'keys' {
content 'text/plain', "{$w.data.keys.join(",")}\n";
}
get -> $uid {
not-found unless $w.data{$uid}:exists;
content 'text/plain', "{$w.data{$uid}.keys.join(",")}\n";
}
get -> $uid, $cid {
not-found unless ($w.data{$uid}:exists) && ($data{$uid}{$cid}:exists);
content 'text/plain', "{$w.data{$uid}{$cid}}\n";
}
}
my Cro::Service $server = Cro::HTTP::Server.new:
:host<localhost>, :port<5000>, :$application;
$server.start;
react whenever signal(SIGINT) {
$server.stop;
exit;
}
ノート
これはすべて、少しラフで準備ができて、いくつかのエラーチェック私は追加します.しかし、私は、あなたが何をすることができるかについて示すことがおもしろいと思いましたRaku . は、データを別のすべての解析から
JSONDataWatcher
クラスは言語のコアです.をお楽しみください.
Reference
この問題について(簡単なことが好き), 我々は、より多くの情報をここで見つけました https://dev.to/scimon/i-like-things-to-be-easy-4pfhテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol