【问题标题】:How to proceed with Python loop after memory crash内存崩溃后如何继续 Python 循环
【发布时间】:2021-07-21 00:24:37
【问题描述】:

我正在为大型数据集的机器学习测试做多个嵌套循环

在这些循环中,我测试不同的算法和数据集大小

问题是我在这个错误或任何其他错误的过程中崩溃了

MemoryError: Unable to allocate 194. MiB for an array with shape (1662, 15269) 和数据类型 float64

我想要一种方法,无论错误如何,代码都会继续

这是我的代码

  for Size in [10, 100, 1000, 10000,100000, 1000000]:
        

        df_reps_all = pd.read_sql("EXEC GetReps_Idea14 " + str(Size) , conn)
        df_results_all = pd.read_sql("EXEC GetResults14 " + str(Size)  , conn)

       for Model in ["SVC","LOG", "RF", "GNB", "KNN"]:
            
            multilabel_binarizer = MultiLabelBinarizer()
            multilabel_binarizer.fit(df['Code'])
            y = multilabel_binarizer.transform(df['Code'])
             
            
            if Model == "LOG":
                mdl = LogisticRegression()
            elif Model == "RF":
                mdl = RandomForestClassifier()
            elif Model == "GNB":
                mdl = GaussianNB()
            elif Model == "KNN":
                mdl = KNeighborsClassifier()
            elif Model == "SVC":
                mdl = SVC()
            print (120)
                
            
            
            clf = OneVsRestClassifier(mdl)
         
            y_pred = cross_val_predict(clf, dfMethod, y, cv=3, n_jobs=-1)

附言我的问题不是如何解决该错误。 我的问题是无论我遇到什么错误,如何继续处理代码

【问题讨论】:

  • 这能回答你的问题吗? How to solve the memory error in Python
  • @enzo 谢谢,但我的问题不是如何解决错误。我的问题是无论我遇到什么错误,如何继续执行代码
  • 把有问题的代码包装在try ... except ... finally?除此之外,没有什么可说的。请澄清。

标签: python


【解决方案1】:

您可以尝试使用try/except。但它可能并不总是适用于内存异常 (read here)。 一种解决方法可能是将其分为 2 个脚本、一个提交作业的主脚本和一个运行它的工作人员。

类似这样的:

master.py
----------
for Size in [10, 100, 1000, 10000,100000, 1000000]:
    for Model in ["SVC","LOG", "RF", "GNB", "KNN"]:
        os.sysmem(f"python worker.py {Size} {Model}")


worker.py
---------
Size = int(sys.agv[1])
Model = sys.argv[2]

df_reps_all = pd.read_sql("EXEC GetReps_Idea14 " + str(Size) , conn)
df_results_all = pd.read_sql("EXEC GetResults14 " + str(Size)  , conn)

multilabel_binarizer = MultiLabelBinarizer()
multilabel_binarizer.fit(df['Code'])
y = multilabel_binarizer.transform(df['Code'])
    

if Model == "LOG":
    mdl = LogisticRegression()
elif Model == "RF":
    mdl = RandomForestClassifier()
elif Model == "GNB":
    mdl = GaussianNB()
elif Model == "KNN":
    mdl = KNeighborsClassifier()
elif Model == "SVC":
    mdl = SVC()
print (120)
    


clf = OneVsRestClassifier(mdl)

y_pred = cross_val_predict(clf, dfMethod, y, cv=3, n_jobs=-1)



所以即使worker失败了,你仍然可以继续设置下一个参数

【讨论】:

    【解决方案2】:

    要在发生此类“崩溃”时继续,您需要捕获并处理 MemoryError 异常。

    找到发生异常的代码的最小部分(完整的堆栈跟踪中应该有一个行号)并将其包装在try .. except 块中。

    try:
        ... some code that can run out of memory ...
    except MemoryError:
        pass
    

    您可能想要做一些其他事情,例如进行一些清理而不是 pass,这将无济于事,然后继续执行下一行代码,但您的问题中没有足够的信息来提供更好的建议。

    如果您想忽略所有其他错误,请将MemoryError 替换为基本调用Exception,它将捕获所有可以捕获的异常。

    【讨论】:

      【解决方案3】:

      您可能想使用 try:... except:... 来捕获错误并忽略它,例如:

      try:
          # your code that may throw an error
      except:
          pass
      

      但是,通常不建议忽略错误并且不采取任何措施。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2021-03-25
      • 2013-12-10
      • 1970-01-01
      相关资源
      最近更新 更多