1

背景: 3 GB の csv テキスト ファイル (20M 行 x 46 列) を SQLite テーブルに読み込もうとしています。データのインポートは次のエラーで失敗します:「テーブルが 46 の値を期待しているときに、レコード 3,493,675 には 2 つのフィールドしかありませんでした」。そのレコードに 2 つのフィールドしかない (破損) か、他の場所に問題があるか (私の疑い) を調べたいと思います。

そこで、gawk を使用して「問題のある」レコードを調べてみました。

gawk -F, "NF<46 {print FNR,$1,NF}"

しかし、エラーメッセージが表示されました(8つのproc、16GB RAMでWindows 2008を実行しているサーバー|管理者権限がありません):

「grow_top_buffer: iop->buf: 1,073,741,826 バイトのメモリを割り当てられません (十分なスペースがありません)」.

私はこのエラーをグーグルで検索し、バグに関する2003年の投稿を見ましたが、解決策は得られませんでした.

ここに問題があります: 4GB RAM の Win 7 ラップトップに同じデータ ファイルがあり、同じバージョンの gawk が正常に動作します – 20M レコード全体を読み取ります...そしてファイル内のすべての 20M レコードには、テーブルに必要な 46 フィールドがあります。

いくつかの異なる gawk ステートメントを試しましたが、すべてサーバーで失敗しました - すべて私の PC で動作します。

質問: Windows サーバーの gawk でバッファ メモリ エラーが発生するのはなぜですか?

ありがとう、ピーター

4

1 に答える 1

2

サーバー マシンが 32 ビット バージョンの Windows を実行していて、PC が 64 ビット バージョンの Windows を実行している場合、gawk はサーバーよりも多くの (仮想) メモリを PC に割り当てることができる場合があります。これは、サーバー上のその量のメモリに対応できない可能性があるためです。

あなたの問題に関して、 awk はファイルを希望どおりに処理するために多くのメモリを必要としません。これは gawk バグのように思えます。Kernighan のOne True Awkなど、別のバージョンの awk を試す

于 2012-05-19T16:25:06.597 に答える