問題タブ [storable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 共用体データ型の格納可能なインスタンスの定義
以下のようなデータ型 (GHC プリミティブ型から構成される)の格納可能なベクトルインスタンスをどのように定義しますか。
この保存可能なチュートリアルを確認しましたが、上記のようなユニオンではなく、同じタイプのベクトルに対してのみ機能します。
optimization - 共用体構造体の格納可能なベクトル定義を記述する際の最適化の提案
以下のデータ型の格納可能なベクトル インスタンスを作成しました (元の質問はこちら):
Storable vector のこれらのインスタンスを定義するためのコードは以下のとおりです。以下のコードで非常に優れたパフォーマンスを得ていますが、その格納可能なインスタンスのパフォーマンスを改善するための一般的な提案に非常に興味があります。一般的な提案とは、次のことを意味します。
- GHC コンパイラのバージョンに固有のものではありません。GHC 6.12.3+ は、以前のバージョンにパフォーマンスのバグが存在し、ここにあるコードに関連する場合、パフォーマンスのバグを除外すると想定できます。
- プラットフォーム固有の提案は問題ありません。x86_64 Linux プラットフォームを想定している可能性があります。
- ハードウェア固有の最適化を利用する提案よりも、アルゴリズムの改善 (大きな O) という形の一般的な提案の方が非常に高く評価されます。しかし、ここでのピーク/ポークのような基本的な操作を考えると、私が知る限り、アルゴリズムの改善の余地はあまりありません (したがって、希少な商品であるため、より価値があります:)
- x86_64 のコンパイラ フラグは許容されます (たとえば、浮動小数点セーフ チェックの削除についてコンパイラに通知するなど)。「-O2 --make」オプションを使用してコードをコンパイルしています。
同様のことを行う (つまり、union/recursive データ型の格納可能なインスタンスを定義する) 既知の優れたライブラリ ソース コードがあれば、それらをチェックすることに非常に興味があります。
アップデート:
Daniel と dflemstr からのフィードバックに基づいて、アライメントを書き直し、コンストラクターを Word8 ではなく Word32 型に更新しました。しかし、これを有効にするには、データ コンストラクターもアンパックされた値を持つように更新する必要があるようです。これは私の見落としでした。そもそもアンパックされた値を持つようにデータ コンストラクターを作成する必要がありました ( John Tibbell によるパフォーマンス スライド- スライド #49 を参照)。そのため、データ コンストラクターを書き直し、アライメントとコンストラクターの変更を加えることで、パフォーマンスに大きな影響を与え、ベクターに対する関数 (私のベンチマーク テストでは単純な合計関数) で約 33% 向上しました。以下の関連する変更 (警告 - 移植性はありませんが、私のユースケースでは問題ではありません):
データ コンストラクターの変更:
保存可能な sizeof と配置の変更:
haskell - 合計バイト長を取得するためのO(1)関数を使用したCStringの格納可能なインスタンスの書き込み
CString(私の場合はnullで終了するC文字)の格納可能なベクトルインスタンスを作成しようとしています。格納可能なインスタンスは、CStringが(Ptr CChar)であるポインターを格納します。したがって、ベクトルの長さはCStringポインターの数です。さて、この保存可能なインスタンスを作成する理由は、FFI CStringからゼロコピーを実行し、unsafeCreateを使用してByteStringを高速ビルドするために使用されるためです(変換後、ここでは中間操作に高速ベクトルを使用します)。ByteStringの高速ビルドを行うには、保存可能なインスタンスに3つのことが必要です。
- バイト単位の全長-格納可能なインスタンスには、ベクターに追加するときに各CStringの長さを格納するためのブックキーピング割り当てと、これまでに格納されたCStringの全長が必要です。C文字列の全長が2^31を超えることはできないとしましょう。したがって、Int32 / Word32は、各CStringの長さと全長を格納するために行います。
- CStringとその長さを格納する関数-O(n)時間。この関数は、CStringをウォークし、その長さを格納します。また、全長をCStringの長さだけインクリメントします。
- 長さを合計バイトで返す関数-O(1)時間。この関数は、全長を格納するフィールドから値を取得するだけです。
カスタムの保存可能なインスタンスを作成する方法は知っていますが、この種のケースを処理する方法はわかりません。カスタム簿記を行う方法を示す簡単なコード(簡単なおもちゃの例でもかまいません)、および簿記の結果を保存/取得する関数を作成することは非常に高く評価されます。
アップデート1(説明)
私の場合、保存可能なベクトルインスタンスを使用する理由は、ボックス化されていない型を使用した高速な計算/変換(C FFIを介して受信したリアルタイムデータ)と、バイト文字列への高速変換(データをリアルタイムで送信するため)の2つです。別のプログラムへのIPC)。高速なバイト文字列変換には、unsafeCreateが優れています。ただし、割り当てる量を把握し、変換用の関数を渡す必要があります。格納可能なベクトルインスタンス(混合型-上記の質問をCString型のみに簡略化した)が与えられた場合、ベクトルの各要素をウォークしてバイト文字列に変換する高速変換関数を簡単に構築できます。次に、それをunsafeCreateに渡すだけです。ただし、割り当てるバイト数も渡す必要があります。AO(n)再帰バイト長計算関数は遅すぎるため、バイト文字列を作成するオーバーヘッドが2倍になる可能性があります。
haskell - ベクトルを含む再帰的データ構造の Storable の定義
以下の形式のデータ構造があります (V は Data.Storable.Vector です)。
最初に、非再帰形式 (つまり、T
コンストラクタなし) のカスタム ストアブル定義を作成しました。T
次に、使用するためのカスタム peek と poke 定義を追加しようとしましForeignPtr
たlength
(Vector
コードは以下にあります)。GHC コンパイラは、型Storable
に対してインスタンスが定義されていないと文句を言いますForeignPtr Elems
。私の質問は、ForeignPtr の Storable インスタンス定義を強制的に記述することなく、Storable 定義で ptr を Vector に格納できるかどうかです。
Haddocs のドキュメントから、ForeignPtr はファイナライザーが割り当てられた単なる Ptr のようです。
ForeignPtrs とタイプ Ptr a の一般的なメモリ参照の本質的な違いは、前者がファイナライザに関連付けられる可能性があることです。
ファイナライズの問題があるため、Ptr
代わりに を使用して問題を回避したくありません。そのため、GHC ガベージ コレクタがそれへの参照を認識できるようForeignPtr
に、ForeignPtr の場所を ( を介して) 格納することを好みます。Ptr (ForeignPtr a)
しかし、そのアプローチでは、 (意味Storable instance
のある制約のため)を定義する必要があります。(Storable a) => Ptr a
ForeignPtr の Storable インスタンスを定義せずに、Storable の Vector に ptr を格納および取得する方法はありますか? ない場合は、ForeignPtr の Storable 定義を記述する必要があります。その場合、それはどのように見えますか?私の推測では、Ptr を ForeignPtr に格納するだけです。
以下の完全なコード:
haskell - 混合保存可能ベクトルをC関数に渡す
私はベクトルのリストを持っています-タイプのセットは既知で固定されています-としましょう、CInt
そしてCChar
。このリストはコンパイル時には不明です。構成は実行時に構成ファイルから決定されます。たとえば、C
関数に2つのベクトルを渡す必要があると判断する場合があります。1つCInt
は長さ10のCChar
ベクトル、もう1つは長さ50のベクトルです。C関数がそれらを解釈する方法については、各ベクトルのベクトルエンコードタイプを渡すことでそのロジックを処理できます(たとえば、0 => CInt
、1 => CChar
)、および渡された各ベクトルのベクトルエンコード長(10,50)。
私が理解しようとしているのは、混合ベクトルのベクトルを生成する方法です(Cに渡すためだけに)。私は以下のようなおもちゃの解決策を試しました(Ptr
実際のコードでは、同じアイデアをモデル化して、混合タイプの保存可能なベクトルを生成します。各Ptrは別の保存可能なベクトルを指します)。型エラーのために失敗しました-以前に尋ねた別の質問でehirdが以前に指摘した存在修飾型に関連していると思われます。C FFIに渡すためにStorableインスタンスを使用しているので、(別の保存可能なインスタンスを定義せずに)型をラップすることはできないと思います。
ghci 7.4.1のエラー:
上記の問題を解決する方法についてのポインタをいただければ幸いです。Data.Vector.Storable.Mutable.newとunsafeWriteを使用してカスタムのベクトル入力関数を作成することもできますが、それでも混合型を適合させる必要があります。
perl - UDP 経由でデータ パッケージを送信する
ストレージから nfreeze で取得したソケット経由でスカラー値を送信しようとしています。ステップバイステップ:
- スカラーを取得します
$serializedHash = nfreeze \%hash;
- ソケット経由で送信したい
$sendSocket->send($serializedHash);
$serializedHash
スカラーが 1024 バイトを超えない限り、これは正常に機能します。私は反対側に最大でのみデータを受信できるソケットを持っているからです。1024バイトの長さ。$serializedHash
また、ファイルに保存してから and で処理することsysread
もできませんsyswrite
。
私のハッシュには200万を超えるエントリがあるため、ソケットごとにすべての行を送信することは望ましくありません。ハッシュ要素はaで区切られている\n
ので、関数を試してみましたsplit
が、200万エントリの配列があります。
UDP ソケットを介してパッケージ内のデータを送信するにはどうすればよいですか?
perl - Perl Storableの使用方法、ハッシュ値の変更
私はPerlの専門家ではないので、これはおそらく簡単な質問です。
私はStorableを使用しており、この例に従ってハッシュを保存しています。まず、元のハッシュを保存します。
それから私はそれを取得します。(別のスクリプト)
私の質問は、ハッシュ値の1つを変更するにはどうすればよいですか?たとえば、次のようなことをします
2番目のスクリプトで。
perl - Perl Storable で許可が拒否されました
perl CGI アプリケーション全体でデータを永続化しようとしています (送信ボタンがクリックされたとき)。しかし、次のコード:
戻り値:
スクリプトにデータを保存する権限を与えるにはどうすればよいですか?
perl - Storable::nfreeze で保存されたデータ構造の解凍に問題がありますか?
MySQL テーブルの 1 つの列に大量のデータが格納されています。Storable::nfreeze
そこに保存された〜5年前のperlコードにアクセスでき、保存される前に凍結されたすべてのハッシュであることがわかります。MySQL 列はTEXT
あり、テーブルはlatin1
エンコードに設定されています。1 回限りのエクスポートのために、このデータを取得しようとしています。このアプリはもともと perl 5.8.x で実行されていたので、perl-5.8.8 で試しています。残念ながら、使用された Storable のバージョンはわかりません。
最初に、最新の Storable 2.39 を使用してみました。それは私に与えます:
Storable-2.14 を使用すると、
Storable-2.13 を使用すると、
>= 2.14 の不当に高いバイナリ イメージ番号は、数値の解析方法に何らかの変化があると思わせます。このコードはおそらく 32 ビット OS で実行されていたと思いますが、今は 64 ビット マシンでこれを試しています。次は、2.13 と 2.14 の差分を実行して、変更の原因を特定できるかどうかを確認します。
誰でもできるガイダンスはありますか?
ありがとうございました!
perl - Trouble while using thaw on the serialized data structure in perl
I am using perl DB_File module to persist the hash variable into a file.
My hash variable contains key as normal string and value as another hash variable.
I used Storable::freeze(\%value);
to serialize the hash value.
But when I tried to retrieve the values, I got an error. For the first time when I run the retrieve code, it works. The next consecutive times, it fails.
I used method like this:
Error message
Storable binary image v25.47 more recent than I am (v2.7) at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/thaw.al) line 366, at retrieve.pl line 15 at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/logcroak.al) line 74 Storable::logcroak('') called at ../../lib/Storable.pm (autosplit into ../../lib/auto/Storable/thaw.al) line 367 Storable::thaw('2/8') called at retrieve.pl line 15