У меня есть текстовый файл из твитов в формате 9GB в следующем формате:
T 'time and date'
U 'name of user in the form of a URL'
W Actual tweet
Всего насчитывается 6 000 000 пользователей и более 60 000 000 твитов. Я читаю по 3 строки за раз, используя itertools.izip(), а затем в соответствии с именем записываю его в файл. Но его принятие слишком длинное (26 часов и подсчет). Как это можно сделать быстрее?
Код публикации для полноты,
s='the existing folder which will have all the files'
with open('path to file') as f:
for line1,line2,line3 in itertools.izip_longest(*[f]*3):
if(line1!='\n' and line2!='\n' and line3!='\n'):
line1=line1.split('\t')
line2=line2.split('\t')
line3=line3.split('\t')
if(not(re.search(r'No Post Title',line1[1]))):
url=urlparse(line3[1].strip('\n')).path.strip('/')
if(url==''):
file=open(s+'junk','a')
file.write(line1[1])
file.close()
else:
file=open(s+url,'a')
file.write(line1[1])
file.close()
Моя цель - использовать моделирование темы на небольших текстах (как, например, при запуске lda во всех твитах одного пользователя, что требует отдельного файла для каждого пользователя), но для этого требуется слишком много времени.
UPDATE. Я использовал предложения пользователя S.Lott и использовал следующий код:
import re
from urlparse import urlparse
import os
def getUser(result):
result=result.split('\n')
u,w=result[0],result[1]
path=urlparse(u).path.strip('/')
if(path==''):
f=open('path to junk','a')
f.write('its Junk !!')
f.close()
else:
result="{0}\n{1}\n{2}\n".format(u,w,path)
writeIntoFile(result)
def writeIntoFile(result):
tweet=result.split('\n')
users = {}
directory='path to directory'
u, w, user = tweet[0],tweet[1],tweet[2]
if user not in users :
if(os.path.isfile(some_directory+user)):
if(len(users)>64):
lru,aFile,u=min(users.values())
aFile.close()
users.pop(u)
users[user]=open(some_directory+user,'a')
users[user].write(w+'\n')
#users[user].flush
elif (not(os.path.isfile(some_directory+user))):
if len(users)>64:
lru,aFile,u=min(users.values())
aFile.close()
users.pop(u)
users[user]=open(some_directory+user,'w')
users[user].write(w+'\n')
for u in users:
users[u].close()
import sys
s=open(sys.argv[1],'r')
tweet={}
for l in s:
r_type,content=l.split('\t')
if r_type in tweet:
u,w=tweet.get('U',''),tweet.get('W','')
if(not(re.search(r'No Post Title',u))):
result="{0}{1}".format(u,w)
getUser(result)
tweet={}
tweet[r_type]=content
Очевидно, это зеркало того, что он предложил и любезно разделял. Первоначально скорость была очень быстрой, но затем она стала медленнее. Я опубликовал обновленный код, чтобы я мог получить еще несколько предложений о том, как это могло быть сделано быстрее. Если я читал из sys.stdin, тогда была ошибка импорта, которая не могла быть решена мной. Таким образом, чтобы сэкономить время и заняться этим, я просто использовал это, надеясь, что он работает и делает это правильно. Спасибо.