15

私は銀行のソフトウェアを構築するために働いている小さな会社で働いています。ここで、次のようなデータ構造を構築する必要があります。

Array [Int-Max] [2] // Large 2D array

それをディスクに保存し、翌日、将来の作業のためにロードします。

さて、私はJava(そして少しC)しか知らないので、彼らはいつも私にC++またはCを使うように要求します。彼らの提案によると:

  1. 彼らは、JavaのArray [Int-Max] [2]がCの1.5倍近くのメモリを消費し、C++がJavaの合理的なメモリフットプリントを消費することを確認しました。

  2. CおよびC++は、Javaでは処理できない、任意の大きなファイルを処理できます。

彼らの提案によると、データベース/データ構造が大きくなるにつれて、Javaは実行不可能になります。このような大規模なデータベース/データ構造で作業する必要があるため、C /C++が常に推奨されます。

今私の質問は、

  1. Javaよりも大規模なデータベース/データ構造でCまたはC++が常に望ましいのはなぜですか?なぜなら、Cはそうかもしれませんが、C++もOOPです。では、Javaよりもどのように有利になるのでしょうか。

  2. 私はJavaを使い続けるべきですか、それとも彼らの提案(C ++への切り替え)は将来大規模なデータベース/データ構造環境で役立つでしょうか?なにか提案を ?

申し訳ありませんが、私はそれらすべての知識がほとんどなく、プロジェクトに取り組み始めたばかりなので、本当に混乱しています。今まで学校のプロジェクトを作ったばかりなので、比較的大きなプロジェクトについてはわかりません。

4

3 に答える 3

20

Javaよりも大規模なデータベース/データ構造でC/C ++が常に望ましいのはなぜですか?なぜなら、Cはそうかもしれませんが、C++もOOPです。では、Javaよりもどのように有利になるのでしょうか。

(オブジェクトの)Java配列1は、実際には参照の配列であることを忘れないでください。簡単にするために、1D配列を見てみましょう。

java:

[ref1,ref2,ref3,...,refN]
ref1 -> object1
ref2 -> object2
...
refN -> objectN

c ++:

[object1,object2,...,objectN]

C ++バージョンを使用する場合、配列で参照のオーバーヘッドは必要ありません。配列は、オブジェクト自体だけでなく、オブジェクト自体も保持します。オブジェクトが小さい場合、このオーバーヘッドは確かに重要になる可能性があります。

また、コメントですでに述べたように、C++で配列とJavaの小さなオブジェクトを割り当てるときに別の問題があります。C ++では、オブジェクトの配列を割り当てます。これらはメモリ内で連続していますが、Javaではオブジェクト自体はそうではありません。場合によっては、Javaプログラムよりもキャッシュ効率がはるかに高いため、C++のパフォーマンスが大幅に向上する可能性があります。私はかつてこのスレッドでこの問題に取り組んだ

2)Javaを使い続けるべきですか、それとも彼らの提案(C ++への切り替え)は、将来、大規模なデータベース/データ構造環境で役立つでしょうか?なにか提案を ?

私たちはあなたのためにそれに答えることができるとは思わない。目的に応じて、それぞれの長所と短所(メモリ効率、使用できるライブラリ、開発時間など)をすべて認識し、決定を下す必要があります。私たちよりもシステムについてより多くの情報を持っているあなたの会社の上級開発者からアドバイスを得るのを恐れないでください。
この質問に対する単純で簡単で一般的な答えがあれば、私たちエンジニアは必要ありませんでしたね。

コアを実装する前に、予想される配列サイズとスタブアルゴリズムを使用してコードをプロファイリングし、プロファイリングして実際の違いがどのようになるかを確認することもできます。(アレイが実際に予想されるメインスペースの消費者であると仮定します)


1:次に説明するオーバーヘッドは、プリミティブの配列には関係ありません。これらの場合(プリミティブ)、配列は値の配列であり、参照の配列ではなく、C ++と同じですが、配列自体(lengthフィールドなど)にわずかなオーバーヘッドがあります。

于 2012-08-22T12:54:51.890 に答える
9

あなたは新しい仕事で経験の浅いプログラマーにいるようです。「彼ら」は長い間ビジネスに携わっており、ドメインとそのプログラミング要件についてあなたよりもよく知っている(または少なくとも知っていると思う)可能性があります。

私のアドバイスは、彼らがあなたがしていると主張していることをすることです。CまたはC++でコードが必要な場合は、CまたはC++で記述してください。C / C ++をあまり知らないために問題が発生すると思われる場合は、事前に警告してください。それでも主張する場合は、問題の責任を負い、主張の原因を遅らせることができます。最善を尽くしていることを確認してください...そして「きしむ車輪」にならないようにしてください。


1)Javaの配列[Int-Max] [Int-Max]はCの約1.5倍のメモリを消費し、C++はJavaの合理的なメモリフットプリントを消費することを確認しました。

アレイの内容にもよりますが、それは実現可能です。

  • Javaは、最適な量に近いメモリを使用して、ほとんどのプリミティブ型の大きな配列を表すことができます。

  • 一方、Javaのオブジェクトの配列は、C /C++よりもかなり多くのスペースを占める可能性があります。たとえば、C ++では、通常、を使用して大きな配列を割り当て、new Foo[largeNumber]すべてのFooインスタンスが配列インスタンスの一部になるようにします。Javaでは、実際には;new Foo[largeNumber]と同等です。new Foo*[largeNumber]つまり、ポインタの配列。各ポインタは通常、異なるオブジェクト/ヒープノードを参照します。これにより多くのスペースが必要になることは簡単にわかります。

2)C / C ++は、Javaでは処理できない任意の大きなファイルを処理できます。

1つの1-DJava配列の要素数には厳しい制限があります...2^31。(この制限を回避することはできますが、コードがより複雑になります。)

一方、単にファイルの読み取りと書き込みについて話している場合、Javaは最大2^63バイトの個々のファイルを処理できます...これはおそらくこれまでにないほどの量です。

1)Javaよりも大規模なデータベース/データ構造でC / C ++が常に望ましいのはなぜですか?なぜなら、Cはそうかもしれませんが、C++もOOPです。では、Javaよりもどのように有利になるのでしょうか。

ハード制限のため。この制限は、JLSおよびJVM仕様の一部です。OOP自体とは何の関係もありません。

2)Javaを使い続けるべきですか、それとも彼らの提案(C ++への切り替え)は、将来、大規模なデータベース/データ構造環境で役立つでしょうか?なにか提案を ?

彼らの提案に従ってください。非常に大きなメモリ内データセットを扱っている場合、それらの懸念は有効です。そして、彼らの懸念が(仮想的に)少し誇張されているとしても、上司/先輩と戦うのは良いことではありません...

于 2012-08-22T12:54:01.153 に答える
7

1)Javaの配列[Int-Max] [Int-Max]はCの約1.5倍のメモリを消費し、C++はJavaの合理的なメモリフットプリントを消費することを確認しました。

それは状況によって異なります。を作成した場合、new int[1]またはnew int[1000]JavaとC++でほとんど違いはありません。スタックにデータを割り当てる場合、Javaはそのようなデータにスタックを使用しないため、相対的な違いが大きくなります。

まず、これがアプリケーションを微調整していないことを確認します。あなたの時間の1日が価値があることを覚えておく価値があります(あなたが最低賃金を得ると仮定して)は約2.5GBです。したがって、これを行うことで1日あたり2.5 GBを節約しない限り、追跡する価値はないと思われます。

2)C / C ++は、Javaでは処理できない任意の大きなファイルを処理できます。

純粋なJavaプログラムで8TBファイルをメモリマップしたので、これが何であるかわかりません。

2 GBを超えてマップできない、または配列に20億を超える要素を含めることができないという制限があります。これを回避するには、複数(たとえば、最大20億個)を使用します。

このような大規模なデータベース/データ構造で作業する必要があるため、C /C++が常に推奨されます。

私は定期的に200〜800 GBのデータと50億を超えるエントリを単一のJavaプロセスにロードします(同じマシンで一度に複数の場合もあります)

1)Javaよりも大規模なデータベース/データ構造でC / C ++が常に望ましいのはなぜですか?

これをC/C ++で行う方法については、Javaよりも多くの経験があり、これを行う方法についての経験はC /C++でのみです。

なぜなら、Cはそうかもしれませんが、C++もOOPです。では、Javaよりもどのように有利になるのでしょうか。

大規模なデータセットを使用する場合、Javaの世界では別のデータベースを使用するのが一般的です(組み込みデータベースは比較的まれです)

Javaは、Cで実行できるのと同じシステムコールを呼び出すだけなので、実行できることに関して実際の違いはありません。

2)Javaを使い続けるべきですか、それとも彼らの提案(C ++への切り替え)は、将来、大規模なデータベース/データ構造環境で役立つでしょうか?なにか提案を ?

結局のところ、彼らはあなたに支払いをします、そして時々技術的な議論は本当に重要ではありません。;)

于 2012-08-22T13:09:40.697 に答える