私は百万行のExcelシートを持っています。各行には100列あります。各行は100個の属性を持つクラスのインスタンスを表し、列の値はこれらの属性の値です。
百万のデータインスタンスを保存するために、ここで使用するのに最適なデータ構造はどれですか?
ありがとう
私は百万行のExcelシートを持っています。各行には100列あります。各行は100個の属性を持つクラスのインスタンスを表し、列の値はこれらの属性の値です。
百万のデータインスタンスを保存するために、ここで使用するのに最適なデータ構造はどれですか?
ありがとう
それは、このデータにどのようにアクセスする必要があるか、および何を最適化する必要があるか (容量と速度など) によって異なります。
100 個の値を持つ 100 万行で、各値が 8 バイトのメモリを使用するのはわずか 800 MB で、64 ビットの場合、ほとんどの PC esp のメモリに簡単に収まります。各列の型をできるだけコンパクトにするようにしてください。
データを格納するより効率的な方法は、列ごとです。つまり、各列にプリミティブ データ型の配列があります。これを行う必要さえないと思います。
数十億行など、さらに多くの行がある場合は、オフ ヒープ メモリ、つまりメモリ マップ ファイルとダイレクト メモリを使用できます。これにより、ヒープを比較的小さく保ちながら、メイン メモリよりも多くのデータを効率的に格納できます。(例: 1 GB のヒープで数百 GB のオフヒープ)
すべてのデータをメモリに保存する場合は、通常、密集したテーブルの場合、またはほとんどのセルが空であることが予想される場合Table
に、Guavaの実装の 1 つを使用できます。それ以外の場合は、データベース (おそらく ehcache や terracota などのキャッシュ システムを備えたもの) の方が適しています。ArrayTable
HashBasedTable
最適なオプションは、ORACLE、MSSQL、MYSQL、および高速で大量のデータを保存できるその他のデータベースのように、大量のデータを保存でき、アクセシビリティを高速化するのに十分な速度のデータベースを使用することです。
それぞれ 100 個の値を持つ行が本当に 100 万行以上ある場合、すべてが記憶に収まるとは思えません... または、特別な理由があるのでしょうか? たとえば、データベースを使用するとパフォーマンスが低下しますか?
ランダム アクセスが必要なので、hibernate のような永続化プロバイダーと、好きなデータベース (mysql など) を使用します。
ただし、永続化プロバイダーの使用方法がパフォーマンスに大きな影響を与えることに注意してください。たとえば、バッチ挿入を使用する必要があります (自動生成された ID とは互換性がありません)。
その種のデータでは、MYSQL データベースを使用することをお勧めします。これは、高速で、そのような大きなファイルを蓄積できるためです。