【问题标题】:Memory Error, performing sentiment analysis large size data内存错误,执行情感分析大数据
【发布时间】:2017-09-29 14:02:18
【问题描述】:

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

输入大小小于 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)

为了避免内存错误,我需要添加哪些额外内容 我在这里先向您的帮助表示感谢。

【问题讨论】:

    标签: python pandas csv nltk sentiment-analysis


    【解决方案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)
    

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

    【讨论】:

    • 请您详细说明代码.. 我想我在与我的代码相关的细节方面犯了一些错误。
    • 对不起,我不能也不会。我什至不知道您的代码的详细信息,或者您不确定的部分。我建议你阅读csv.DictWriter 文档(有时可能很难取悦),尽力理解我的代码示例,然后尽你最大的努力并提出一个新问题。随时在这里发表评论并让我看一下。无论如何,我向您保证,这种方法将永远解决您的内存占用问题。
    • 实际上问题中的代码几乎是整个代码块..
    • 然后按照我的建议重写,问一个你想不通的问题。
    • 或者至少让您的尝试在某个地方可用,我会采取一个的方式帮助您解决它。如果这还不够,我会再告诉你一个新问题。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 太棒了.. !!让我试试它是如何工作的并会更新回来..谢谢
    • @SitzBlogz 实际上是的,你正在使用它
    • @SitzBlogz 我会仔细看看,否则会删除我的答案
    • @SitzBlogz 我更新了我的答案以提供一些一般性提示,尝试使用 memory_profiler 查看哪些步骤占用了大部分内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多