我正在尝试对来自社交网络的大量数据进行情感分析。代码的一部分非常适合数据尺寸。
输入尺寸小于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)
我需要包括什么额外的内容来避免记忆错误我在这里先向您的帮助表示感谢。
您不需要额外的任何东西,您需要更少。为什么您一次将所有推文加载到内存中?如果您一次只处理一条推文,则可以处理比底端智能手机中发现的记忆更少的数据的Terabytes。
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)
或类似的东西。我没有费心关闭您的文件手,但是您应该关闭您的文件。您可以进行各种调整和调整,但重点是:一次分析一条推文时没有理由炸毁您的记忆。
一些可能对您有帮助的一般技巧:
1。仅加载您需要存储的列:
pd.read_csv
提供USECOLS参数以指定您要读的列
df = pd.read_csv(path+F_name+".csv", usecols=['col1', 'col2'])
2。删除未使用的变量
如果您不再需要变量,请使用del variable_name
3。使用内存profiler
配置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