我正在尝试对社交网络中的大量数据进行情感分析。代码的一部分在数据量很小的情况下工作得很好。
输入大小小于20mb的计算没有问题。但如果大小超过20mb,我会得到内存错误。
环境: Windows 10,anaconda 3.x,更新版本包。
代码:
def captionsenti(F_name):
print ("reading from csv file")
F1_name="caption_senti.csv"
df=pd.read_csv(path+F_name+".csv")
filename=path+F_name+"_"+F1_name
df1=df['tweetText'] # reading caption from data5 file
df1=df1.fillna("h") # filling NaN values
df2=pd.DataFrame()
sid = SentimentIntensityAnalyzer()
print ("calculating sentiment")
for sentence in df1:
#print(sentence)
ss = sid.polarity_scores(sentence) # calculating sentiments
#print ss
df2=df2.append(pd.DataFrame({'tweetText':sentence ,'positive':ss['pos'],'negative':ss['neg'],'neutral':ss['neu'],
'compound':ss['compound']},index=[0]))
df2=df2.join(df.set_index('tweetText'), on='tweetText') # joining two data frames
df2=df2.drop_duplicates(subset=None, keep='first', inplace=False)
df2=df2.dropna(how='any')
df2=df2[['userID','tweetSource','tweetText','positive','neutral','negative','compound','latitude','longitude']]
#print df2
print ("Storing in csv file")
df2.to_csv(filename,encoding='utf-8',header=True,index=True,chunksize=100)为了避免内存错误,我需要包含哪些额外的内容?谢谢您的帮助。
发布于 2017-09-29 22:07:24
一些可能对您有帮助的一般提示:
1.只加载需要内存的列:
pd.read_csv提供usecols参数以指定要读取的列
df = pd.read_csv(path+F_name+".csv", usecols=['col1', 'col2'])2.删除未使用的变量
如果不再需要某个变量,请使用del variable_name将其删除
3.使用内存分析器
描述内存memory_profiler。引用文档中的示例内存日志,您将获得如下内存配置文件:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a发布于 2017-09-30 01:41:52
你不需要额外的东西,你需要更少的东西。为什么要一次加载内存中的所有tweet?如果你一次只处理一条推文,你可以用比低端智能手机更少的内存来处理at级的数据。
reader = csv.DictReader(open(F1_name))
fieldnames = ["TweetText", "positive", "negative", ...]
writer = csv.DictWriter(open(output_filename, "w"), fieldnames=fieldnames)
writer.writeheader()
for row in reader:
sentence = row["TweetText"]
ss = sid.polarity_scores(sentence)
row['positive'] = ss['pos']
row['negative'] = ss['neg']
<etc.>
writer.writerow(row)或者类似的东西。我没有费心关闭你的文件句柄,但你应该的。你可以做各种各样的调整和调整,但重点是:当你一次分析一条推文时,没有理由炸毁你的记忆。
https://stackoverflow.com/questions/46490474
复制相似问题