2

「建設的」ではないため、私の質問は閉じられるかもしれませんが、とにかく...私はすでに回答を検索しましたが、それらのほとんどは一般的すぎます。私の修士論文プロジェクトでは、大量 (つまり、数千) の Web ページをクロールし、それらを完全にデータベースに保存する必要があります。さまざまな方法でそれらを分析し、いくつかの機械学習アルゴリズムを試して、さまざまな方法で解析する必要があるため、これが必要です。現時点では、この目的のために SQlite データベースを使用しており、優先 Web フレームワークとして Django と組み合わせています。

単一の Web ページの HTML データ全体を Django に入れましたTextField。つまり、Web ページごとにデータベース テーブルに個別の行があり、すべての Web ページのコンテンツがテーブルの 1 つの列に格納されます。現在の問題は、データのクエリと並べ替え、特にデータの反復処理が非常に遅いことです。これまでに約 1000 の Web ページをクロールしましたが、データベース ファイルのサイズはすでに 2 GB を超えています。さらに、4 GB の RAM がいっぱいになり、コンピューター (Macbook Pro mid-2009、Core2Duo 2.26 Ghz、500 GB HDD、OSX 10.8) が応答しなくなります。事前にキャッシュするアイテムの数を制限すると、クエリの数が増えるため、データの処理がさらに遅くなります。さらに多くのデータをクロールする必要があるため、現在のセットアップでは十分に拡張できません。

私の質問は次のとおりです。 データのクエリをより高速に実行できるように、HTML データをより効率的に保存するにはどうすればよいですか? MySQL や PostgreSQL などの別の RDBMS に切り替えることは理にかなっていますか? または、MongoDB などのドキュメント指向のデータベース システムをお勧めしますか? これまでのところ、SQlite の経験しかないので、実際に何を使用すればよいかわかりません。修士論文の締め切りが迫っているので、いろいろな設定を試す時間がありません。

あなたが私を助けるのを助けるために、ここにいくつかのさらなる要件があります:

  • コンピューターのすべてのメモリを消費することなく、SQlite と比較して大きな HTML データのクエリのパフォーマンスが向上します (ワークロードを他のコンピューターに分散することはできません)。
  • Django との多かれ少なかれ良好な統合
  • これは研究作業のみであるため、実稼働環境では実行されず、私のコンピューターでのみ実行されます (おそらく私の教授のコンピューターでも実行されます)。

この膨大な量の可能性にどういうわけか迷っているので、どちらの方向に進むべきかを決めるのを手伝ってくれたらうれしいです. 事前にどうもありがとうございました!:)

4

1 に答える 1

2

これは単なる答えですが、考慮すべき提案です。あなたの問題は、コードスニペットまたはヒントで対処するには、具体的ではありません。

最初: フェッチされるデータをできるだけ減らすようにしてください。つまり、完全な HTML コードを保存する理由は、Web ページに公開されているテキスト (別名コンテンツ) だけに関心があることだと思います。したがって、クロール中に HTML からデータを取り除き、純粋な情報を保存します。私が間違っていて、他のことに興味がある場合は、遠慮なく訂正してください。

2 番目: クエリ可能なデータの生成を試みます。クローラーは、データを簡単に処理できる方法でデータベースにデータを書き込む必要があります。map-reduce アプローチが有効な方法になる可能性があります。これにより、クロールに時間がかかりますが、後でデータをすばやく取得できます。これは、完全なコンテンツではなく、クロールしたすべてのページへのマップのみをほとんど格納しています。少なくとも、クエリは完全なデータ テーブルに触れず、最初に mapreduced コンテンツのみに依存します。

3 番目: ハードウェアをアップグレードします - 大量のデータを処理したいですか? 準備してください(またはあなたと一緒に時間を持ってください)。好きなだけ RAM を Macbook に取り付けてください (RAM を中に入れることができますよね?! Apple のもので RAM をアップグレードできると言ってください..) 本当に安いからです。

第 4 : SQLite は、OS の io-cache などに依存しており、データを再フェッチするのに時間がかかる場合があるため、hdd を大量に使用します。SSDドライブで取得しようとする場合(これは、長期的にはSSDにとって不健康になります;-))、またはPCへの高速接続でリモートデータベースを使用して、hdd-> ram-> cpuサイクルがあなたの制限ではなく、RAMとおそらくCPUだけです(あなたのプログラムはマルチコアではないと思いますよね?)

5 つ目と最後:私は今どこのメディアにも出回っている派手な言葉を入れるのは嫌いですが、Hadoop に関する IBM の記事を見てください

于 2012-09-20T18:33:49.907 に答える