問題タブ [memory-optimization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - サーバーからいくつのオブジェクトを取得する必要があり、NSCache に保存できるオブジェクトはいくつですか?
私のサービスは一度に最大 500 個のオブジェクトを返します。データ量が 60 個のオブジェクトを超えると iPhone アプリケーションがクラッシュすることに気付きました。この問題を回避するために、上位 40 件の結果のみを返すクエリを実行していますが、データ全体を返すよりも遅いです。
- ベスト プラクティスとは何ですか? また、より多くのオブジェクトを取得するにはどうすればよいですか?
- iPhoneのアプリケーションに割り当てられるメモリの最大量は何ですか?それを拡張する方法はありますか?
- サーバーからいくつのオブジェクトを取得する必要がありますか
- NSCache にはいくつ保存できますか?
c - 有界数値積分
私はコードを求めているのではなく、洞察を求めていることに注意してください。おそらく、すでに同様の問題に遭遇した人からのものです。
組み込みシステムでリアルタイムに実行されるコードを管理しています。安全上の理由から、新しいチェックを実装する必要があります。
このチェックは、特定の変数の積算値に基づいています。積分は、最後の "T_s" 秒にわたる必要があります。つまり、新しいサイクルごとに、変数が T_s 秒前に持っていた値を削除し、現在の値を追加する必要があります。
素朴なアプローチは、最後の T_s*frequency 浮動小数点値を配列に格納することです。
これは 62.5Hz で動作するため、多くの貴重で限られたメモリを急速に浪費します。
明らかに精度を犠牲にして、そのようなチェックのメモリフットプリントを大幅に削減する既知のアプローチはありますか?
値は実際のシステムからの測定値であり、関数によって生成されたものではありません。
M ポイントのそれぞれに N 個の平均値を格納し、N 個の平均値を統合することを考えました。これにより、メモリ要件が N+M の数値に削減され、T_s*frequency よりも大幅に小さくすることができますが、次のように思います。
これが調査され、「最適な」ポイントが見つかった場合 (たとえば、M の関数として)。検索しましたが、「数値積分」を含むものを検索しても探しているものにつながらないため、Google-fuが壊れているようです。
より良いアプローチがあれば
この投稿に C のタグを付けたのは、C がプロジェクトの公式言語であるためです。残念ながら、ANSI-C で機能しないソリューションは実行できません。
cuda - CUDA の特定のメモリ使用量の最適化
次の方法で様式化できるデータ処理タスクがあります。私はdata
(~1-10GB) と、これといくつかの (double) inputsummary
に基づいて (~1MB) を生成する関数を持っています。の ~1000 の値に対してこれを取得する必要があり、これは GPU にとって完璧なタスクのように見えました。繰り返しますが、入力はすべてのスレッドで同じであり、直線的に読み取られますが、各スレッドは独自の を生成する必要があります。関数は、異なる に対して個別に実行されます。data
x
summary
x
data
summary
x
ただし、オン CPU のすべての値をブルート ワンスレッドで循環させてx
も、K520 よりも 3 倍悪いパフォーマンスしか得られません。これがメモリ集約型のタスクであることは理解していますが (スレッドは彼のランダムな部分にアクセスして書き込む必要がありますsummary
)、GPU が最初の 1000 倍の利点を失う可能性があることを理解するのにまだ苦労しています。data
メモリを使用して to フィードをチャンクでフィードしようとしましたが__constant__
(すべてのスレッドで同じ入力であるため)、目に見える改善はありませんでした。nvprof によって報告される典型的なブロック実行時間は 10 ~ 30 秒です。
このタスクに適した最適化についての洞察をいただければ幸いです。
編集: 以下は、問題を再現するサンプル コードです。g++ (5 秒のレポート実行時間) と nvcc (7 秒のレポート実行時間) の両方でコンパイルできます。プロファイリング結果は以下の通り
==23844== プロファイリング結果:
Time(%) Time Calls Avg Min Max Name
98.86% 4.68899s 1 4.68899s 4.68899s 4.68899s Kernel(Observation*, int*, Info**)
1.09% 51.480ms 4 12.870ms 1.9200us 50.426ms [CUDA memcpy HtoD]
0.06% 2.6634ms 800 3.3290us 3.2950us 5.1200us [CUDA memcpy DtoD]
0.00% 4.3200us 1 4.3200us 4.3200us 4.3200us [CUDA memcpy DtoH]
編集 2: 私は厳しい散在メモリ アクセスを並列化することによってコードを作り直してみました。簡単に言うと、私の新しいカーネルは次のようになります
これには --- に 18 秒、 --- に 172 秒かかります<<<dim(20, 40, 1), 1000>>>
。これ<<<dim(20,40,10), 1000>>>
は、単一の CPU スレッドよりも悪く、並列タスクの数が直線的に増加します。
c - 関数ロジックは、明示的な文字列のコピーなしで char 文字列と wchar_t 文字列の間で再利用されますか?
コマンドを格納するために C でデータ構造を作成しています。これは、私が満足していないものに切り詰められたソースです。
これは完全にうまく機能しますが、ツリーがwchar_t
. CommandTree
のパディングにより7 バイト未満のデータ型が同じくらい多くのメモリを消費することに気付いたので、これを追加することにしましたが、コードを複製しないようCommandTree_putn
に、 wchar_t-supporting のロジックを再利用しましたCommandTree_putnw
。
char
ただし、とのサイズの違いにより、wchar_t
単に配列を渡すことはできません。を使用して変換しmbstowcs
、一時wchar_t *
を に渡す必要がありCommandTree_putnw
ます。これは最適ではありません。これはCommandTree_putn
、 が最も多く使用され、格納された文字列のメモリ使用量が 5 倍 ( sizeof (char)
~sizeof (char) + sizeof (wchar_t)
) になることを考えると、これらの多くが長いコマンドでインスタンス化される場合にスタックする可能性があります。
ロジックを含む 3 番目の関数を作成し、渡された文字列を aにsize_t
キャストする値に応じて、またはC が静的に型付けされていることを考えると、 、それぞれのタイプへのキャストを使用してロジックをほぼ複製する必要があり、これにより、「ロジックの単一インスタンス」のアイデアが台無しになります。void *
const char *
const wchar_t *
s
したがって、最終的に問題は、プログラム ロジックを 1 回だけ提供し、ラッパーconst char *
をconst wchar_t *
それぞれ渡すことができるかwchar_t *
ということです。const char *
python - Pandas の拡張可能なデータ構造 - メモリ消費を最小限に抑える
これは多くの人にとって重複した質問のように思えるかもしれませんが、満足のいく答えを見つけることができませんでした.
200ms ごとに最悪のケースのデータを追加する TimeSeries データ オブジェクトがあります。現在、これは非常にメモリを大量に使用しているため、基礎となるデータ構造を再度作成する必要があり、古いオブジェクトをクリーンアップしていないようです。私は何かを試しました
まったく違いはありませんでした!
問題は、私のプロセスがメモリが 1GB しかないホストで動作し、この種の処理がホストのメモリをすぐに使い果たしてしまうことです。
分析は200ミリ秒ごと/ティックごとに実行されるため、少なくとも過去30時間分のデータをメモリに保持する必要があります。
メモリを最適化するための提案 - それでも pandas.TimeSeries 機能を維持します (時間間隔に基づくスライス)。
regex - 一連の正規表現を複数の URL に効率的に適用する
URL のセット (数百万) があり、正規表現のセット (> 60k 正規表現) を実行して、URL が正規表現に一致するかどうかを判断し、それらを置換パターンに置き換える必要があるシナリオがあります。
パターンは次のようになります。
Regex.Replace(url, "^http([s]?):/(/www.|/)en.wikipedia.org(.*)", "http$1://en.m.wikipedia.org$3" );
メモリと実行時間に制約があります。現在、上記の疑似コードコードのようなものしか実装していませんが、6k の正規表現 (20Mb) でもメモリ消費が高すぎます。この種の問題をすでに処理しているライブラリがあるかどうか、またはここでメモリとランタイムを最適化するために構築する必要があるデータ構造の種類について誰かが提案しているかどうかを知りたいです。
いくつかの例を示します。左側は一致パターン、右側は置換パターンです。
^http([s]?):/(/www.|/)youtube.com/watch\?(. ) http$1://m.youtube.com/watch?$3 ^http([s]?): /(/www.|/)facebook.com/(pages/. |[^/] $) http$1://m.facebook.com/$3 ^http([s]?):/(/www.| /)twitter.com/(. ) http$1://mobile.twitter.com/$3 ^http([s]?):/(/www.|/)yellowpages.com/(. ) http$1:// m.yellowpages.com/$3 ^http([s]?):/(/www.|/)imdb.com/(タイトル|名前)/(. ) http$1://m.imdb.com/$3/ $4 ^http([s]?):/(/www.|/)facebook.com/pages/(. ) http$1://m.facebook.com/pages/$3 ^http([s]?): //detail.chiebukuro.yahoo.co.jp/qa/question_detail/q(\d+)$ http$1://m.chiebukuro.yahoo.co.jp/detail/q$2 ^http([s]?): //www.ebay.com.au/itm/([^/] )/(\d+)$ http$1://m.ebay.com.au/itm/$2/$3 ^http([s]?) ://www.youtube.com/user/([^/?&]*)$ http$1://m.youtube.com/user/$2
r - R で少数の種類の要素のみが入力された大きな行列のサイズを縮小する
私は次のようにマトリックスを持ってsdist
いR
ます。
数種類の要素しかない場合でも、この行列のサイズは大きくなります。
これらの種類の行列のサイズを縮小する方法はありますか? 0の数が少ないため、スパース行列を使用できません。