2016-05-02 18 views
1

私はカスタムJavaランダムフォレストの実装をCythonを利用するSciKit実装と比較しています。アルゴリズムは非常に似ており、私は同じデータセットでそれらをテストしました。 Javaの実装には、Pythonよりもはるかに多くのメモリが必要です。私はこれがいくつかの原因によって引き起こされる可能性があることを知っていますが、そのうちのどれがJavaのスペース効率に対してどれくらいの割合を占めているかを把握したいと思っていました。両方のアルゴリズムが最適に書かれていると仮定するか、少なくともほとんど最適であると仮定すると、メモリ使用量にどの程度の違いがあると思いますか?Java対Cythonメモリ効率

+0

「require」と言ったときに、Python実装が使用しているものの周りに最大ヒープサイズを設定すると、メモリエラーが発生することになりますか? – JimmyJames

+0

はい、そうです。 – user123959

+0

メモリ使用量の違いを数値化できれば助かります。例えばそれは100%多くですか? – JimmyJames

答えて

1

LinuxまたはMacの場合は、「time」コマンドを使用してテストできます。これにより、各プログラム(Java、Python、C)が実行されるのにどれくらい時間がかかります。メモリ効率をテストする場合は、デバッガ(Cのgdbなど)を使用して、コードをステップ実行して、「ボンネットの下で」何が起こっているのかを正確に確認することができます。私はそれが本当にそれになると思う、いくつかのベンチマークテストを実行する必要があります。

私が見つけたことは、いくつかの状況ではJavaがCより高速で実行されることがありますが、時にはCがより良いメモリ使用と最適化を持つことがあります。私はこれが役立つことを願っています

1

私は、リンゴからJavaへの実装が、Pythonバージョンに匹敵することを期待しています。あなたが言うように、ここには多くの要因がありますが、メモリ使用量に大きな違いが見られる場合は、Java実装の記述方法に何かがある可能性が最も高いです。

私の経験では、Javaプログラムは、それが必要以上に多くのメモリを使用する場合、通常、その理由は、アプリケーションのようなものやっているということであるということである。

  1. は、一度に入力レコード1を取り、コレクションにそれを置きます
  2. つまり

一度にコレクション1からプロセスの各レコードは、それが不必要にヒープ内の大量のデータを保存するということで、それはアプリケーションのデザインについてですが、Javaの程度の基本的な何もありません。

メモリが500%増えると、これはJava固有の可能性はほとんどありません。これは、アルゴリズムで使用されるすべてのバイトに対してJavaが5バイトのオーバーヘッドを持つことを意味します。それが現実であれば、Javaは非常に高価になります。 GoogleやAWS上で動作するクラウドソフトウェアの多くを実行することは実際には実行可能ではなく、Androidには意味をなさないだろう。ソースがなければ、なぜ誰があなたにこれを見ているのかを伝えることはそれほど多くありません。

私が考えることができるのは、Cythonが各単語に8バイトを置いているときに64ビットを使って1バイトを保持するようなものだけです。これが当てはまる場合は、Javaバージョンで修正できるものです。

+0

CythonではなくPythonを明確にするために。つまり、CコードとJavaコードの効率を比較しています。 – user123959

+0

@ user123959 cython.orgのメインページによると、 "Cython言語はPython言語のスーパーセットです。"多くの言語はC言語にコンパイルされており、Javaもそうです。生成されるCの「効率」は、コンパイラによって異なります。 CとJavaを単に比較しているわけではありません。 CythonにJavaよりも少ないメモリを使うことを可能にするいくつかのトリックがあるかもしれないが、私はそれがJavaコードが書かれている方法である可能性が高いと思う。 – JimmyJames

関連する問題