内存错误,执行情绪分析大尺寸数据

时间:2017-09-29 14:02:19

标签: python pandas csv nltk sentiment-analysis

我正在尝试对来自社交网络的大量数据进行情绪分析。代码的一部分适用于小尺寸的数据。

小于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)

为避免内存错误,我还需要包含多少内容 我在这里先向您的帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

一些可能对您有帮助的一般提示:

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

答案 1 :(得分:1)

你不需要额外的东西,你需要更少。为什么一次将所有推文加载到内存中?如果您一次只处理一条推文,则可以处理数TB的数据,其内存少于您在底端智能手机中找到的数据。

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)

或类似的东西。我没有费心关闭你的文件句柄,但你应该。您可以进行各种调整和调整,但重点是:当您一次分析一条推文时,没有理由炸毁您的记忆。