2017-09-24 3 views
2

私は何千ものURLをクロールするDjangoプロジェクトにクローラを持っています。クロールは2時間ごとに実行されます。 1秒間に複数のリクエストが発生するため、データベースが遅くなる可能性があります。Djangoのオブジェクトに一時ストレージを使用するには?

これは、クモからの解析方法である:あなたが見ることができるように

def parse(self, response): 
    httpstatus = response.status 
    url_obj = response.request.meta['url_obj'] 
    xpath = url_obj.xpath 
    elements = response.selector.xpath(xpath + '/text()').extract() 

    ... EXCEPTIONS ... 

    Scan.objects.create(url=url, httpstatus=httpstatus, 
           price=price, 
           valid=True) 

、私はすべての要求(第2で数十)の後にデータベースにアクセスする必要がありますが、このデータベースは、あまりにもユーザーによって使用されています。さらに、これらのオブジェクトをフロントエンドに使用して、スキャン全体が完了するまでは使用できません。

私の考えは、新しく作成されたScanオブジェクトのための何らかの種類の仲介/一時記憶域を作成し、スキャンが完了した後、それらをメインデータベースに移動することです。

どうすればいいですか?あなたはなにか考えはありますか?

+0

https://docs.djangoproject.com/en/1.11/topics/cache/#memcached –

+0

@SachinKukreja?さらに、それをメモリに保持するにはあまりにも多くのデータです。あなたは詳しく説明できますか? –

答えて

0

Scanオブジェクトをリストに累積してから、bulk_create()オブジェクトを準備することができます。これにより、データベースのヒット数が大幅に削減されます。これは助けることができるどのよう

scans = [] 

.... 

def parse(self, response): 
    httpstatus = response.status 
    url_obj = response.request.meta['url_obj'] 
    xpath = url_obj.xpath 
    elements = response.selector.xpath(xpath + '/text()').extract() 

    ... EXCEPTIONS ... 

    scans.append(Scan(url=url, httpstatus=httpstatus, 
          price=price, 
          valid=True)) 

.... 

Scan.objects.bulk_create(scans) 
関連する問題