1つの巨大なメモリブロックに格納されている文字列の大きなリストがあります(通常、10万以上または100万以上の文字列があります)。これらは実際にはハッシュであるため、文字列のアルファベットはA-F0-9に制限され、各文字列の長さは正確に32バイトです(したがって、格納されている「圧縮」)。これからこのリストをメインリストと呼びます。
メインリストからアイテムを削除できるようにしたい。これは通常一括で行われるため、このリストで見つけて削除する必要のあるハッシュの大きなリスト(通常は約10万から10k)を取得します。この操作の最後に、大きなメモリブロックに空のブロックを含めることはできないため、それを考慮する必要があります。すべてのアイテムがメインリストに含まれることは保証されていませんが、複数回含まれることはありません。再配置はできません。メインブロックは常に同じサイズのままです。
メインリストを反復処理し、指定されたハッシュを削除するかどうかを確認するという単純なアプローチはもちろん機能しますが、少し時間がかかります。また、ハッシュに削除のフラグが立てられるたびに、メインリストの最後の要素でハッシュを書き換えて、空のブロックがないという条件を満たすため、小さなメモリブロックの移動が少し多すぎます。もちろん、これにより何千もの小さなmemcpyが作成され、キャッシュミスが大量に発生するため、処理速度がさらに低下します。
より良いアプローチはありますか?
いくつかの重要な注意事項:
- メインリストは並べ替えられておらず、並べ替えに時間を無駄にすることはできません。これはプロジェクト全体と書き換えによって課せられる制限であるため、リストを常に並べ替えることはできません(不可能な場合もあります)。
- メモリは実際には問題ではありませんが、使用量が少ないほど良いです
- STLは使用できますが、ブーストはできません