のバッファで問題があります。私はgetmemとfreemem、またはtmemorystreamを考えたことがありますが、それを解決するのに厳密には理解していません。私には、読み書き可能なtfilestreamを使ってファイルをコピーするバッファを使う必要があります。 私は一度にメモリにすべての負荷をうまく負荷したくないし、ディスクに書き込んだりしています。それのために、私は解決策を見つけましたが、それは私には必要ありません。 ありがとうございました。ダニエラ。私はこの問題を解決することができます:1MB以上のバイトのバッファを使用したい、私はスタックのオーバーフローがあるので、配列でそれが可能ではありません1MB
答えて
スタックオーバーフローが発生した場合、変数はスタックに収まりません。あなたは明らかにローカル変数を使用しています。
代わりにヒープを使用して問題を解決してください。 GetMem
またはSetLength
です。
簡単な解決策の1つは、ダイナミックアレイを使用することです。それらのデータはヒープ上に割り当てられますので、スタックオーバーフローを避けることができます。メモリ割り当て関数を直接操作することの利点は、それらがrefcountされ、割り当てられたメモリが最後の参照が範囲外になると自動的に解放されることです。
var buffer:array of byte;
begin
SetLength(buffer,100000);
...
//Will be freed here as buffer goes out of scope
end;
バッファ変数はスタックに割り当てられ、Delphiコンパイラで使用されるデフォルトの最大スタックサイズは1 MiBです。だから、解決策は、プロジェクトのオプションまたは次のグローバルディレクティブを使用して上限を設定することです:
{$MAXSTACKSIZE 4194304} // eg. now maximum is 4 MiB
他の方法は、ヒープの代わりにスタックを使用することで、動的に割り当てられたメモリのいずれか、あなたのケースでは、おそらく最良の解決策になりますダイナミックアレイ。
パフォーマンスノート:スタックはヒープより高速です。
によって制御されます。スタックサイズの増加は危険を伴います。アプリ内の各スレッドはその仮想メモリを予約する必要があります。それを上げることは、アドレス空間に圧力をかけます。ヒープは大きなブロックのために行く方法です。 –
@David Heffernan、スタックは32ビットWindowsでは安価なので、これらの「危険」は心配する実用的な問題ではありません。 –
マルチコアマシンで安いわけではありません。 4GBのアドレス空間は、64ウェイ・マシンと4MBスタックで素早く食べられるという。 –
- 1. 2個のエラーがありますが、私はそれを解決することはできません(リストビュー)
- 2. R私は解決することができないんだけど少し問題があります列
- 3. 私はこの問題を解決することはできません
- 4. 誰かが私はこの問題を解決する手助けすることができます私は
- 5. TypeError:POSTデータはバイトまたはバイトの反復可能でなければなりません。それはタイプstrであることができません
- 6. 私はそれを達成することができます問題はありません
- 7. アンドロイドに1MB以上のファイルをアップロードまたは投稿できません
- 8. が、私はこれを理解することはできません、私のスクリプトは問題
- 9. Railsでは、以下のことが可能ですか?where()列が配列内にありませんか?
- 10. - 私のコードに問題がある場合、私は理解することはできませんC++
- 11. オブジェクトは有効ではありません<p>私は同じエラーメッセージで質問があることを認識していますが、私の問題の解決策を見つけることができないようです。</p>
- 12. JSON.NETは私が解決することができません、次の問題を抱えているTypeパラメータ
- 13. タイプこのmyobjとこのmyobj *は互換性がありません私の問題はである
- 14. RMSリアルタイムスケジューリングが真であるためには、関係の証明に問題はありません。私は式の右辺を解決する方法を見ることができますが、どのようにしているものをCとTを知らないとき、私はそれが必要ではないことを証明し、それが十分であることを確認することができますか?
- 15. 私のマルチステップフォームは、私はそれを何度もGoogleで検索できますが、解決策を見つけることができませんでした
- 16. が、この解決することはできません
- 17. この機能に問題があります。文字列の値を返すことができません
- 18. 私は、私のアンドロイドアプリケーションでいくつかの問題がある、それを解決するには?
- 19. ggplot2:私はこのどこかのソリューションを見てきましたかなり確信していますが、私はそれを見つけることができなかったとして、ここでは私の問題である
- 20. 私はまだRaycastHitとLookAtの問題を解決することができません。
- 21. startActivityはそうここにある、私は働く私の問題への解決策を見つけることができていないAndroidの
- 22. 誰かがこのエラーメッセージで私を助けることができますか?私はそれを理解することはできません
- 23. 私はここにボタンがあり、jdfiddleでそれをやってみることができますが、HTMLではありません
- 24. Wordはこの文書を読むことができませんでした。それは壊れている可能性があります
- 25. は私がラジオボタンにそれをクリックしたときにここでの問題がある
- 26. 表は、私は(私はそれが非常に簡単だと思う、しかし、私はそれを解決することはできません)この問題を持っているテキストをリサイズするが、それはいけない
- 27. は、どのように私はあなたがコンテンツをスクロールすることができますので、このページでは、オーバーフローボックスを使用してオーバーフローのdiv
- 28. エラー、私は次のエラーを解決することができません
- 29. (私はそれがマルチテナントになると、データベースはしばしば見なされている知っている。しかし、これは私の質問ではありません。この問題は、データベースの話ではありません。)マルチテナントアプリケーション(構造)
- 30. 私は切り上げと私のGTINのためにそれを得ることができません
エラーが発生するため、配列の代わりにメモリ関数を使用するのは悪い方法です。スタックオーバーフローが発生する理由を理解してください。あなたはおそらくループ中または再帰関数内にいるでしょうが、問題はループ内でプログラミングエラーを起こしたようなものです。 – az01
実際、彼の問題*は配列の割り当てにあります。再帰とは関係ありません。 1 MBの通常のスタックサイズなので、このような大きなチャンクを使用したい場合、ヒープに移動する必要があります。 –
@ az0典型的なスタックの合計サイズは1MBです(私はリンカにそれを変更するように指示することができると思いますが、これは正しいことではありません)。スタックに1MBの配列を割り当てるのは間違っており、OPの問題です。ヒープに大きなデータを割り当てることは正しいことです。 – CodesInChaos