Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 20, 2013 21:38:55

juche-songun
Зарегистрирован: 2012-10-26
Сообщения: 42
Репутация: +  -2  -
Профиль   Отправить e-mail  

парсер и пожерание памяти.

Суть такова что файл весит 700М в нем 13 кк строк, но скрипт все время жерт по 10-60М памяти каждые Н секунд.

#!/usr/bin/env python2.7
#-*- coding: utf-8 -*-
import sys, time, urllib2
def chckdomain(listdomains, ftrue, ferror):
	headers={'User-agent':'Googlebot/2.1 (+http://www.googlebot.com/bot.html)'}
	while True:
		try:
			domain = listdomains.get()
			if not domain:
				sys.exit()
			
			request = urllib2.Request(domain, None, headers)
			request.get_method = lambda : 'HEAD'
			data = urllib2.urlopen(request).info().get('X-Powered-By', '')
			if data:
				ftrue.write(data+";;"+domain+";;true\n") 
			else:
				ftrue.write("0;;"+domain+";;false\n") 
		except urllib2.HTTPError, e:
			ftrue.write("0;;"+domain+";;"+str(e.code)+";;error\n") )
			ferror.flush()
			del  e
		except Exception, e:
			ferror.write("0;;"+domain+";;"+str(e)+"\n")
			ferror.flush()
			del e
		ftrue.flush()
		
		del domain
if __name__ == '__main__':
	from multiprocessing import Process, Queue
	listdomains = Queue(0)
	for domain in open(sys.argv[1], 'r'):
		listdomains.put(domain.rstrip())
	print "crawler"
	for idz in xrange(int(sys.argv[2])): #requests
		Process(target=chckdomain, args=(listdomains, open('./work/out/'+str(idz)+'.txt', 'w'),open('./work/error/'+str(idz)+'.txt', 'w'),)).start()	

Отредактировано juche-songun (Июнь 20, 2013 21:40:52)

Офлайн

#2 Июнь 21, 2013 00:31:03

Michail_V
Зарегистрирован: 2013-06-19
Сообщения: 13
Репутация: +  -1  -
Профиль   Отправить e-mail  

парсер и пожерание памяти.

может скажу глупость, но я вижу open(sys.argv, ‘r’): а закрытие не вижу… может из-за этого?
может лучше такую комбинацию использовать (она сама и закрывает и открывает

with open(path, "r") as file:

Офлайн

#3 Июнь 21, 2013 02:20:09

Exception
Зарегистрирован: 2013-02-11
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

парсер и пожерание памяти.

Michail_V
может скажу глупость, но я вижу open(sys.argv, ‘r’): а закрытие не вижу… может из-за этого?может лучше такую комбинацию использовать (она сама и закрывает и открывает
Насколько, именно я понял проблема в том что растет по мере работы у него.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version