2017-06-14 11 views
2

私はC++で書かれたプログラムとpythonの間でデータを渡しています。C++プログラムにコマンドライン引数で渡すことができるデータの量は?

私はこれを行うための最も簡単な方法の一つ発見しましたが、その後、ちょうどsubprocess.call('cprog.exe arg1 arg2', shell=True)を使用してPythonでそれを呼び出すと、これはCythonを使用して回避し、引数arg1, arg2.... etc

を介してデータを転送するために、C++プログラムをコンパイルすることで、ブーストなど...私が見つけたことは、窓に取り組むには大きな苦痛です。特に、インターネットに接続されていないエージングサーバでは、 (この投稿に返信してcythonやブーストなどを助けようとしないでください - 私は議論を主題に限定したい)。

私の質問は:このアプローチの限界は何ですか?

データの配列全体をシリアル化/エンコード/デコードして、このようにコマンドライン引数で渡すことはできますか?サイズが数ギガバイトのファイルはどうですか?

これは、ハードドライブへの書き込みよりも速いアプローチでしょうか?


EDIT:これが関連しているようだ: Maximum Length of Command Line String

+2

C++言語仕様では、 'main()'に渡されるコマンドライン引数の最大サイズは指定されていません。実際の制限は、オペレーティングシステムによってまったく異なります。 –

+1

リムニットがあるOSによって異なりますが、リムニートがあります。一般的な方法は、stdinを使うことです。 –

+0

あなたの回答に基づいて、私は検索条件を変更し、これを見つけました: https://stackoverflow.com/questions/3205027/maximum-length-of-command-line-string 私は答えが含まれていると思います!ありがとう – Ben

答えて

0

メインの署名はあなたがそのためのargvのサイズによって制限されている、とするguarenteedされることはありません

int main(int argc, const char** argv) 

です32767以上の引数を渡すことができます。あなたのOSとマシンに基づいてそれ以前にヒットした他の制限があるかもしれませんが、これは言語に組み込まれているものです。

任意のコンパイラでは、intのサイズが大きくなり、より多くの引数をサポートできる可能性があることに注意してください。

+1

)A)引数が後方にあるB)なぜ2147483647? – NathanOliver

+0

A)whoops-semantics anyhow;) B)intは明確に定義された範囲を持っています - あるいはargcが負である可能性がありますか?興味深い – UKMonkey

+0

@ NathanOliver 'int'が32ビットであると仮定すると、argcの最大値は2147483647になります。 – CodingHero

1

完全な回答ではありませんが(ハード制限についてはコメントできません)、コマンドラインで渡したデータはにはと一致する必要があります。そのプロセスの間、このメモリを解放する方法...これは、データのギガバイトを共有するための実用的な方法ではありません。

shell=Trueを使用しているので、作成するコマンドはシェルによって解釈されます。これにより、受け入れる引数の数と引き数の大きさに関する制限が課されます。引数が合計でどれくらいの量のメモリを消費するかも制限します。 あなたのOS /シェルに他の人が触れることができるように、面白いかもしれません。私はあなたのタグのためにWindowsとcmd.exeを疑っていますが、確信が持てません!


(それはあなたの質問への答えではないのですが)これは、一般的に悪い考えです、そして、あなたは真剣に、プロセス間通信(IPC)のためのパイプを使用して見なければなりません。これにより、エンコード/デコードのオーバーヘッド、サイズ制限の懸念、データのディスクへの書き込みの懸念が取り除かれます。

+0

偉大な - ありがとう!私は今パイプを使うことに目を向けます。 – Ben

関連する問題