1億レコードをメモリにロードするために必要なメモリの量。各レコードに7バイトが必要だとします。これが私の計算です
each record = <int> <short> <byte>
4 + 2 + 1 = 7 bytes
needed memory in GB = 7 * 100 * 1,000,000 / 1000,000,000 = 0.7 GB
この計算に問題がありますか?
1億レコードをメモリにロードするために必要なメモリの量。各レコードに7バイトが必要だとします。これが私の計算です
each record = <int> <short> <byte>
4 + 2 + 1 = 7 bytes
needed memory in GB = 7 * 100 * 1,000,000 / 1000,000,000 = 0.7 GB
この計算に問題がありますか?
100,000,000レコードの場合、オーバーヘッドを考慮に入れる必要があります。正確に何をどのくらいのオーバーヘッドが発生するかは、言語によって異なります。
たとえば、C / C ++では、構造体またはクラスのフィールドは特定の境界に揃えられます。詳細はコンパイラによって異なる場合がありますが、一般に、intは4の倍数のアドレスで開始する必要があり、shortは2の倍数で開始する必要があります。charはどこからでも開始できます。
したがって、4 + 2 + 1がint、short、charを意味すると仮定すると、これらをこの順序で配置すると、構造体は7バイトを使用しますが、少なくとも構造体の次のインスタンスはで開始する必要があります。 4バイトの境界なので、中央に1つのパッドバイトがあります。実際、ほとんどのCコンパイラでは、構造体全体が8バイト境界で始まる必要がありますが、この場合は問題ではありません。
メモリを割り当てるたびに、割り当てブロックにいくらかのオーバーヘッドがあります。コンパイラは、割り当てられたメモリの量と、場合によっては次のブロックがどこにあるかを追跡できる必要があります。100,000,000レコードを1つの大きな「新規」または「マロック」として割り当てる場合、このオーバーヘッドは取るに足らないものになります。ただし、それぞれを個別に割り当てると、各レコードにオーバーヘッドが発生します。正確にはコンパイラによって異なりますが、私が使用した1つのシステムは、割り当てごとに8バイトだったと思います。その場合、ここでは各レコードに16バイトが必要になります。ブロックヘッダー用に8バイト、データ用に7バイト、パッド用に1バイトです。したがって、予想の2倍の時間がかかる可能性があります。
他の言語では、オーバーヘッドが異なります。最も簡単な方法は、おそらく経験的に調べることです。システムコールが何を使用しているかを調べ、使用しているメモリの量を調べてから、この値を確認し、100万のインスタンスを割り当て、もう一度確認して、違いを確認します。
構造ごとに7バイトだけが本当に必要な場合は、ほぼ正しいです。
メモリ測定の場合、通常は1024の係数を使用するため、次のようになります。
700 000 000 / 1024³ = 667,57 MiB = 0,652 GiB