私たちは、その後、 人工知能-スマートと創造的なプラットフォーム・アーキテクチャの成長経路(B) -ビッグデータアーキテクチャの記事は 継続
以前の私たちは、それらの多くは、創造的な設計プラットフォームのアプリケーション層ですが、実際、人工知能では、最も重要なのは、私たちの最も人気のある非常に多くの言語がされる基礎となるアルゴリズムの実現につながるアルゴリズム、アルゴリズムのためのフレームワークの多くは、あるについて話しましたこれらのアルゴリズムは、言語サービスパッケージにそれを設計します、その後どのように、言語はCやC ++、続いてのpythonであるだけでなく、アルゴリズムは、言語に行きますか?それは、言語を横断する方法を、アプリケーション層プラットフォーム、呼び出し元のアルゴリズムをそれを使用するアプリケーション層プラットフォームに算術関数の束を提供し、アプリケーション層は、一般的に達成するためのプラットフォームのJava言語ですができませんか?そして、一般的なR&Dチーム、スタッフがサービスにパッケージ化される算術関数の彼らの博士課程の研究のアルゴリズムを作成する方法を、その後、ほとんどのJava、Java開発者ですか?
1、Pythonのアルゴリズムのサービス
pythonベースのWebフレームワークの多くは、我々は簡単に、サービスパッケージのpythonのために最も一般的に使用されるフレームワークフラスコとDjangoをアルゴリズムコードを置くことができるので、このような状況に鑑みて、それは、比較的簡単であるべき、ここではとフラスコ実施形態では、見た目のサンプルコードを達成するために。
# - * -コーディング:UTF-8 - * - フラスコの輸入フラスコから、リクエスト、レスポンス 輸入JSON アプリ=フラスコ(__ name__) クラスアルゴリズム(オブジェクト): ... @ app.route( '/ getSyncCrawlSjqqResult'、メソッド= [ 'GET 「]) のgetAlgorithm結果デフ(): ... レスポンス(json.dumps(Algorithm.parser(request.args.get( "パラ"))を返す)、MIMEタイプ= "アプリケーション/ JSONを") の場合__name__ == '__main__': (= Trueのスレッドポート= 3001、ホスト= '0.0.0.0')app.run
サービスとして2、C及びC ++
、JavaのJNIインタフェースモードはC / C ++と呼ばれている使用して、JNIはコードを簡単に異なるプラットフォーム上で移植することができることを確実にするためにJavaのネイティブインタフェース書かれた手順を使用して、Javaのネイティブインタフェースの頭字語です。Java1.1開始から、JNIはJavaコードと言語の相互作用で書かれた他のコードを可能にする標準のJavaプラットフォームの一部となります。JNIは、特にCおよびC ++用に設計されたネイティブコンパイル言語に始まるが、それは限り、呼び出し規約がそれをサポートするよう、他のプログラミング言語を使用してからあなたを防ぐことはできません。コンパイルされたローカルのJavaコード、一般的に失われたプラットフォームの移植性と対話するために使用します。しかし、いくつかのケースではそれも必要で、許容されそう。例えば、古いライブラリの一部を使用して、ハードウェア、オペレーティングシステムと対話する、またはプログラムのパフォーマンスを向上させることができます。アンドリュース(アンドロイド)は、C / C ++がこの方法では、次の手順の多くを使用している呼び出します。
1)、ネイティブと宣言して、Javaクラスのメソッドを書きます
パブリック クラスAlgorithmExample { 公共の 静的な ネイティブ文字列callAlgorithm(); // すべての変更は、ローカルにネイティブのキーワードステートメントのある 静的{ System.loadLibraryを(「Algorithm.so」); //は、アルゴリズムのローカルライブラリをロード } 公共の 静的な 無効メイン(文字列[]引数){ System.out.printlnは(AlgorithmExample。callAlgorithm()) } }
このコードでは、最終的には、クラスの初期化時にアルゴリズムので、ライブラリパッケージをロードするためにSystem.loadLibraryを(「Algorithm.so」)によって要求されるので、ここアルゴリズムライブラリパッケージですされているダイナミックリンクライブラリです。
2)、書かれたJavaコードの後、我々は、Javaコードコンパイラ生成されたクラスファイルを配置する必要があります
javacのAlgorithmExample.java
3)ファイル名の拡張ヘッダhを生成することは行われてもよいjavahはAlgorithmExample
JNI HelloWorldのヘッダファイルの内容:
/ * このファイルを編集しないでください-それはマシンが生成される* / の#include <jni.h中> / * クラスAlgorithmExampleのヘッダ* / #ifndefの_Included_ AlgorithmExample の#define _Included_ AlgorithmExample の#ifdef __cplusplus はextern " C " { #endifの / * *クラス:AlgorithmExample *方法:callAlgorithm *署名:()V * / JNIEXPORTストリングJNICALL Java_ AlgorithmExample_ callAlgorithm(JNIEnvの * 、jオブジェクト)。 #ifdef __cplusplus } #endifの #endifの
メソッドの名前を述べて最初の文書によって生成された4)、同じ達成するために、ネイティブメソッドを記述するための方法およびjavahはコマンド
#include " jni.h中" の#include " AlgorithmExample.h " // の#include otherheaders JNIEXPORT文字列JNICALL Java_ AlgorithmExample_ callAlgorithm(JNIEnvの * ENV、jオブジェクトOBJ) { のprintf(" HelloWorldの\ nは!" ); リターン'のHelloWorld'; }
5)、ダイナミックリンクライブラリを生成します
GCC -Wall -D_JNI_IMPLEMENTATION_ -Wlは、 - 殺す-で-Id:/ジャワ/ -Idを含む:/ジャワ/ / Win32のは、(例えばAlgorithmExample.dllとしてDLL出力ファイル名)-oを-shared含む(入力C /このようabc.cとしてC ++ソースファイル、)
使用された場合6)、クラスパスディレクトリがプロジェクトに)Linuxのファイルの下で(そうDLLファイル(Windows環境)やファイルを生成する必要があります。
B、C / C ++コールバックのjava、つまり、特定の使用は、本文書の庭でブログを参照することができ、C / C ++コードもJNIの方法のJavaコードから呼び出すことができますが、この使用は非常に一般的ではありません:HTTPS ://www.cnblogs.com/jiangjh/p/10991365.html
JavaやJavaのを介してC / C ++ JNIが呼び出しかどうかを経由してC / C ++ JNIを呼び出し、特にJNIのアプローチを通じてC / C ++を呼び出すJavaの、実際にはいくつかの問題になりやすいです。
Lメモリリーク:
C / C ++の空きメモリがタイムリーでない場合、C / C ++自体が開かGCコレクタメモリ、JVMの仮想マシンは、彼らの自動回復を助けることができない、それはメモリリークとなり、jmapのことで、このメモリリークが確認するために、ヒープ・ダンプを取得しますメモリ使用量は、メモリ使用量のこのスナップショットを見ることができません。
リットルJNI自分の問題のいくつか:
私はかつて遭遇したダイレクトByteBufferのメモリは仮想マシンのメモリの外に割り当てられたダイレクトのByteBufferのJNIによって回収することができない、デフォルトのJVMの起動がサイズ制限を行わず、直接のByteBufferは-XXことができます。MaxDirectMemorySizeを設定するには、このパラメータ外側の直接のByteBufferは、割り当てられたヒープメモリ、すなわちトリガーフルGC指定されたサイズに達することを意味します。値MaxDirectMemorySizeセット、直接のByteBuffer jmapのが見ることができないピース。)この値が上限であり、デフォルトはsun.misc.VM.maxDirectMemoryまで、64Mであることに注意してください、プログラムで-XXを(得ることができます高速のメモリ使用量。私たちは、メモリ使用量の上部からそれを見ることができます。これは、別のブログの記事の著者を参照することについて:https://www.cnblogs.com/laoqing/p/10380536.html
Cは、PythonのC / C ++を呼び出すことによって、アルゴリズムは、Pythonのサービスにカプセル化すること
ソースを表示しなければならない再現元の記事の(著、。著者によって予約元の記事、歓迎は増刷が、元の記事のブロガー、マークされていない出所を再印刷する著作権を保持するために、作者の著作権は、法律に基づいて起訴され、著者の成果を尊重してください)//www.cnblogs.com/laoqing/p/11364435.htmlます。https:ソースを記入してください
Pythonのctypesのを容易にC言語コードを呼び出すことができるのctypesを使用して、提供され、モジュールが互換性のあるデータ・タイプとロードする機能またはそうDLLファイルを提供するC言語をctypesは。
以下のCコード、一方は共にint型の二つの数字であり、二つの機能を提供する2つの数値float型であり、そして我々は呼び出すためにこのコードモジュールのPythonのctypesを使用
書式#include <stdio.hに> ... int型 add_int(int型、int型); フロート add_float(フロート、フロート)。 INT add_int(INT NUMA、INT 無感覚) { 戻り NUMA + 麻痺。 } フロート(add_floatがフロート、NUMAをフロート麻痺)を { 戻り NUMA + 麻痺。 } ...
Linuxでそのファイルを生成するので、Pythonのプロジェクトにファイルをパックするためにはgcc -shared -Wl、-soname、加算器-o adderExample.so -fPIC addExample.cを使用してください。
その後、我々はそうパッケージを呼び出すためのPythonコードを書くことができます
インポートのctypes adderExample = ctypes.cdll.LoadLibrary(' ./adderExample.so ' ) res_int = adderExample.add_int(10,5 ) 、印刷(" 10 + 5等于" + STR(res_int)) 、A = ctypes.c_float(7.2 ) B = ctypes.c_float(5.3 ) add_float = adderExample.add_float add_float.restype = ctypes.c_float プリント(" 7.2 + 5.3等于" + STR(add_float(b)参照))
ctypesのような他の同様のBoolean型、および浮動小数点のために重大な制限を持って使用する場合は、あなただけのことができますが、呼び出し中のオブジェクトC正しいタイプCTYPEを使用する必要があり、それを達成することは困難です。
Pythonインタプリタ自体は達成するためにC言語を使用することであるため、実際には、限り、我々はCで書かれたコードをアルゴリズムとして仕様のPythonインタプリタに合わせて、それに統合することができます。
継続するには...