Hammerspace ...は小説内でファンが想像する、すぐにアクセスできる余次元収納領域であり、アニメ、コミック、ゲームのキャラクターが空気からオブジェクトを引き出すことができる理由を説明するために使用されます。
このジェムは、親しみのあるハッシュライクインターフェースを使用して、文字列の永続的かつ同時アクセス可能なオフヒープストレージを提供します。バルク書き込みとランダム読み取り用に最適化されています。
アプリケーションでは、決して変更されなかったり、極めてまれにしか変更されないデータが使用されることがよくあります。多くの場合、このデータにアクセスする際に多少のレイテンシを受け入れることができます。たとえば、ユーザーのプロフィールは Web サービス、データベース、または memcache などの外部共有キャッシュから読み込まれる場合があります。レイテンシがはるかに重要になる場合もあります。たとえば、翻訳を何度も使用し、外部キャッシュからアクセスするために約 2 ミリ秒の遅延が発生すると、耐えられないほど遅くなります。
パフォーマンス上の問題を回避するために、このタイプのデータは多くの場合、起動時にアプリケーションに読み込まれます。残念ながら、これはデータがヒープに格納されることを意味します。ガーベッジコレクタは、(少なくとも Ruby MRI の場合)すべての実行時にオブジェクトをスキャンする必要があります。さらに、複数のプロセスを使用するアプリケーションサーバでは、プロセスごとにデータのコピーが存在することになり、メモリの非効率な使用となります。
Hammerspace は、データをヒープからディスクに移動することでこれらの問題を解決します。バルク書き込みとランダム読み取り用に最適化されたライブラリとデータ構造を利用することで、許容できるレベルのパフォーマンスを維持できます。データは永続的であるため、データが変更された場合を除き、アプリケーションを起動するときに外部キャッシュまたはサービスから再読み込みする必要はありません。
残念ながら、これらの低レベルのライブラリは同時実行ライターを常にサポートしているわけではありません。Hammerspace は、複数のプロセスによる単一の共有データのコピーの安全な更新と読み取りが可能なように、同時実行制御を追加します。最後に、Hammerspace のインターフェースは Ruby の Hash
を模倣するように設計されているため、既存のアプリケーションとの統合が簡単かつ明確になります。ライブラリを使用する新しいバックエンドを実装することで、さまざまな低レベルのライブラリを使用できます。(現時点では、Sparkey のみがサポートされています)。バックエンドは一連のメソッド([]
、[]=
、close
、delete
、each
、uid
)のみを実装する必要がありますが、基盤のライブラリでより効率的な実装がサポートされている場合は、他のメソッドのデフォルト実装をオーバーライドできます。