3

株式取引履歴の CSV ファイルがあり、そのサイズは 70 メガバイトです。プログラムを実行したいのですが、起動するたびに 30 秒待ちたくありません。

1. 次のように、CSV ファイルを Haskell ソース ファイルに変換するだけです。

From                       | TO
-------------------------------------------
1380567537,122.166,2.30243 | history = [
...                        |       (1380567537,122.166,2.30243)
...                        |     , ...
...                        |     ]

2. テンプレート Haskell を使用して、ファイルのコンパイル時に解析します。

最初のアプローチを試みたところ、1 つのリスト (70 MB のソース コード) をコンパイルしようとして 3 時間後に、GHC が 12 GB のメモリを消費することがわかりました。

では、TH は利用可能な唯一のアプローチでしょうか? または、ハードコードされた大きなデータ構造をソース ファイルで使用できますか? なぜ GHC はファイルをコンパイルできないのでしょうか? 複雑な最適化か何かのために組み合わせ爆発に行きますか?

4

1 に答える 1

3

非常に多くのデータをハードコーディングすることは一般的なユースケースではないため、コンパイラがそれを適切に処理できないことは驚くべきことではありません。

より良い解決策は、データを CSV よりも読みやすい形式にすることです。たとえば、CSV ファイルを解析し、結果の構造をcerealなどのパッケージを使用してシリアル化するプログラムを作成することを検討してください。その後、メイン プログラムはバイナリ ファイルを読み取ることができます。これは、CSV ファイルよりもはるかに高速です。

このアプローチには、新しいデータでのプログラムの実行がより簡単になり、再コンパイルが不要になるという追加の利点があります。

于 2013-10-01T06:15:27.257 に答える