そのため、詳細が多く、行が不完全なデータファイル(セミコロンで区切られている)があります(AccessとSQLがチョークになります)。これは、40年間、セグメント、サブセグメント、およびサブサブセグメント(合計で約200の要素)に分割された郡レベルのデータセットです。要するに、それは巨大であり、私が単にそれを読もうとすると、それはメモリに収まらないでしょう。
だから私の質問はこれです、私はすべての郡が欲しいのですが、たった1年(そしてセグメントの最高レベル...最終的には約100,000行になります)を取得するための最良の方法は何でしょうかこのRへのロールアップ?
現在、私はPythonで無関係な年を切り取り、一度に1行ずつ読み取って操作することでファイルサイズの制限を回避しようとしていますが、Rのみのソリューション(CRANパッケージはOK)を好みます。Rで一度に1つずつファイルを読み込む同様の方法はありますか?
どんなアイデアでも大歓迎です。
更新:
- 制約
- 私のマシンを使用する必要があるので、EC2インスタンスはありません
- 可能な限りRのみ。この場合、速度とリソースは問題ではありません...私のマシンが爆発しない限り...
- 以下に示すように、データには混合タイプが含まれていますが、後で操作する必要があります
- データ
- データは3.5GBで、約850万行17列です。
- 数千行(〜2k)の形式が正しくなく、17列ではなく1列しかありません
- これらはまったく重要ではなく、削除できます
- このファイルから必要なのは最大100,000行だけです(以下を参照)
データ例:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
データがRに収まるように、いくつかの列を切り取り、利用可能な40年(2009-2010から1980-2020)から2つを選びたいと思います。
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
結果:
行われたすべての提案をいじくり回した後、JDとMarekによって提案されたreadLinesが最適であると判断しました。マレクがサンプル実装を提供したので、私はマレクにチェックをしました。
ここでの最終的な答えとして、マレックの実装を少し修正したバージョンを再現しました。strsplitとcatを使用して、必要な列のみを保持しています。
また、これは注意すべきであるMUCH Rが60ほどかかりますが、Pythonは5分で3.5ギガバイトのファイルを介してchompしのように...少ない効率的なPythonのより...しかし、あなたが持っているすべてがRである場合、これがチケットです。
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
アプローチによる失敗:
- sqldf
- これは間違いなく、データが整形式である場合、将来このタイプの問題に使用するものです。ただし、そうでない場合は、SQLiteがチョークします。
- MapReduce
- 正直なところ、ドキュメントはこれについて少し怖がっていたので、私はそれを試してみることができませんでした。オブジェクトもメモリ内にある必要があるように見えました。その場合、ポイントが無効になります。
- bigmemory
- このアプローチはデータに明確にリンクされていますが、一度に処理できるのは1つのタイプのみです。その結果、big.tableに入れると、すべての文字ベクトルが削除されました。ただし、将来のために大きなデータセットを設計する必要がある場合は、このオプションを有効に保つためだけに数値のみを使用することを検討します。
- スキャン
- スキャンには、大きなメモリと同様のタイプの問題があるように見えましたが、readLinesのすべてのメカニズムがあります。要するに、今回は法案に適合しなかったのです。
sed
および/またはawk
作成して、直接読み取ることができるようにすることができます。これは答えというよりは回避策なので、コメントとして残しておきます。