Data.table: SHMサイズがエラーを超えました

作成日 2017年07月14日  ·  3コメント  ·  ソース: Rdatatable/data.table

機能リクエスト、/ dev / shmのサイズをチェックして、mmapサイズと一致するかどうかを確認します。 私の場合、Dockerコンテナ内でRを使用しており、/ dev/shmのデフォルトサイズは64Mです。 コードがパイプされたストリームでmmapを実行すると(hadoop fs -cat /myfile.csvなど)、パイプからmmapにshmサイズのバイトのみが読み込まれます。 正常と思われるCapiを介したエラーは報告されません。 ただし、freadがファイル形式について不平を言った理由をデバッグすると、data.tableのRおよびCコードが深く掘り下げられ、このメカニズムが使用されていることがわかりました。 報告されたエラー(パイプが切断された場所に基づくランダムメッセージ):

 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

これは、次のようにすることで再現できます。

  • / dev/shmよりも最大5メガ大きいファイルを作成します
  • / dev / shmを64Mのようなものに調整します(これはDockerコンテナーのデフォルトです)
  • 「cat〜/myfile.csv」でfreadを実行します<-catがパイプを作成します
  • Docker V1.12 +
  • DockerハブからのCentos最新画像
  • R-open v3.4.0(マイクロソフト)

コード内: https ://github.com/Rdatatable/data.table/blob/master/src/fread.c
788行目あたりで、おそらく/ dev / shmのサイズをチェックして、メモリに読み込んだばかりのファイルと一致するかどうかを確認する必要があります。 Dockerの私の場合、失敗したテスト条件の詳細な出力は次のとおりです。

 > dat.df3<-fread("/opt/cloudera/parcels/CDH/bin/hadoop fs -cat /user/tcederquist/tim_pop_comm_14_5 | head -3668850" ,sep=",", header=TRUE, verbose=TRUE)
 Input contains no \n. Taking this to be a filename to open
 File opened, filesize is 0.062500 GB.
 Memory mapping ... ok
 ....basic output
 Type codes (point  8): 1111
 Type codes (point  9): 1111
 (ERROR):Expected sep (',') but ' ' ends field 0 when detecting types from point 10: 14183667

予想された結果:

 File opened, filesize is 0.373524 GB.

さらに、失敗すると、失敗したときの行番号やその他の有用な情報を内部的に認識します。 冗長フラグを発見する前に、手動で値に焦点を合わせる必要がありました。 通常のエラーメッセージが行番号を示していると便利です。 vebose = Tは、このテストケースのように区切り文字の数を計算するときの場所を示します(ファイルに2,000万レコードがあることがわかっているため)。

 Count of eol: 3668839 (including 0 at the end)
 nrow = MIN( nsep [11006514] / (ncol [4] -1), neol [3668839] - endblanks [0] ) = 3668838
fread

最も参考になるコメント

みんな、私はzUMIS/19を報告した人です。 私はあなたの開発1.10.5を試しましたが、それは完璧に機能します。 素晴らしい仕事の人!

全てのコメント3件

これと同じ問題を見つけた人にとって、短期的な修正は、コンテナの共有メモリサイズを増やすか、/ dev/shmが小さすぎる場合はOSで行うことです。 一般的な最新のOSは、使用可能なメモリの50%を使用します。 私の64Gアマゾンec2インスタンスでは、次を使用するようにDockerコンテナを設定しました。

 docker run --shm-size="30g" ... other stuff ...

同意しました。 申し訳ありません。
開発における最近の変更はニュースからのこれです:

RAMディスク(/ dev / shm)は、システムコマンド入力の出力には使用されなくなりました。 動作するときは高速でしたが、デバイスのフルエラーが多すぎました。 例:#1139およびzUMIs/19。 報告してくれたKyleChungに感謝します。 標準のtempdir()が使用されるようになりました。 RAMディスクを使用する場合は、TEMPDIRを/ dev/shmに設定します。 ?tempdirを参照してください。

それでも問題が解決しない場合は、dev 1.10.5を試して、新しい問題を開いてください。

みんな、私はzUMIS/19を報告した人です。 私はあなたの開発1.10.5を試しましたが、それは完璧に機能します。 素晴らしい仕事の人!

このページは役に立ちましたか?
0 / 5 - 0 評価