首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深度学习中的大数据帧MemoryError

深度学习中的大数据帧MemoryError
EN

Stack Overflow用户
提问于 2019-11-30 19:17:30
回答 1查看 280关注 0票数 0

前言

大家好,

我试图用StellarGraph软件包建立一个几何深度学习模型。对于较小的数据集,它工作良好,但不幸的是,它不能扩展到更大的数据集。有关机器、环境、使用数据和由此产生的错误的信息如下所示。

机器规格:

DDR4

  • SWAP:
  • CPU: Intel核心i5-8350 u
  • RAM:8GB
  • 4 GB +4 GB (在不同SSD中分为两个交换文件)
  • SSD: 250 GB + 250 GB (2280和2242 NVMe)

环境:

64-bit

  • Python
  • Linux 5.3.11_1 3.6.9

使用的数据(从sys.getsizeof()获取的大小):

  • 稀疏块对角矩阵(形状: 158,950 x 158,950;大小:56)
  • 稠密特征矩阵(形状: 158,950 x 14,450;大小: 9,537,152)

单元:

  • networkx 2.3
  • numpy 1.15.4
  • pandas 0.25.3
  • scipy 1.1.0
  • scikit-learn 0.21.3
  • stellargraph 0.8.2
  • tensorflow 1.14.0

问题描述

我的目的是建立一个几何深度学习,以分类的基础上,邻接矩阵获得的静息状态功能磁共振成像。邻接矩阵假设55个感兴趣区域,从而得到55x55个矩阵。在构建深度学习模型时,采用了StellarGraph中的谱图卷积网络模型,该模型以图形对象和节点特征为输入。通过将所有被试的邻接矩阵组合而得到的稀疏块对角线矩阵生成了图对象。而节点特征是每个节点的特征(1个节点有5个特征值),构造成密集块对角矩阵。

在此之前,我使用人口样本的子集(大约170)建立了模型。它运行得很完美,我想我可以使用更大的数据集来做同样的事情。不幸的是,使用相同的代码,我在注册MemoryError对象时得到了一个StellarGraph。代码和错误显示在下一节。

编码和错误

代码语言:javascript
复制
# Data parsing with scipy.io as sio and pandas as pd
data = sio.mmread('_data/sparse.mtx')
feature = sio.mmread('_data/sparse-feature.mtx')
feature = pd.DataFrame.sparse.from_spmatrix(feature)

# Create graph object using networkx as nx
g = nx.from_scipy_sparse_matrix(data)

# Create StellarGraph object and its generator
gs = StellarGraph(g, node_features=feature) # MemoryError
generator = FullBatchNodeGenerator(gs)

由于保密原因,我很抱歉没有提供sparse.mtxsparse-feature.mtx文件,但我希望以前对数据形状和大小的描述可以帮助您理解它的结构。使用上述代码,python给出了以下错误:

代码语言:javascript
复制
>>> gs = StellarGraph(g, node_features=feature) # MemoryError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 786, in __init__
    super().__init__(incoming_graph_data, **attr)
  File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 381, in __init__
    node_features, type_for_node, node_types, dtype
  File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 216, in _convert_from_node_data
    {node_type: data}, node_type_map, node_types, dtype
  File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 182, in _convert_from_node_data
    data_arr = arr.values.astype(dtype)
  File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 5443, in values
    return self._data.as_array(transpose=self._AXIS_REVERSED)
  File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 822, in as_array
    arr = mgr._interleave()
  File "/home/lam/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 840, in _interleave
    result = np.empty(self.shape, dtype=dtype)
MemoryError

在监视内存消耗时,我观察到RAM只消耗了其总容量的55%,而交换空间根本没有被使用。在运行代码时,我只使用TTY + tmux,只运行vimtoppython会话。此外,我还确保没有其他占用内存的进程在后台运行。因此,我确信内存瓶颈很可能是由python造成的。

我试过的

为了利用内存消耗,我尝试使用dask来管理密集的feature数据帧。不幸的是,StellarGraph函数只能有熊猫数组、熊猫数据帧、字典、元组或其他可迭代的输入。

除了dask之外,我还尝试使用稀疏矩阵(因为几乎80%的数据集都是零值的)。然而,它给了我TypeError,因为StellarGraph不能将稀疏矩阵作为它的node_features

我还阅读了管理大型数据集的几种解决方案,其中(大部分)建议迭代地将数据解析为python会话。但是,我无法在StellarGraph中找到关于这种方法的任何文档。

另一种选择是使用拥有更好硬件的计算机,但遗憾的是,由于资金有限,我无法这么做。我是个学生,现在买不起更好的机器。

势解

  • 升级内存。我将尝试从其他计算机中挽救RAM,但目前我的最大尺寸将是16 GB。我不确定这是否足够。
  • 使用较小块的feature数据集。我设法采用了这个解决方案,但模型的准确性非常差(50%)。

问题

为什么在没有动态交换的情况下,allocation?

  • How只使用55%的内存?
  1. 应该有效地管理大数据帧吗?
  2. 在创建StellarGraph对象时如何处理MemoryError
  3. 实际上需要多少内存?32足够吗?
EN

回答 1

Stack Overflow用户

发布于 2019-12-01 14:33:17

Python运行得很好。这是一个由StellarGraph引起的实现问题。

我认为StellarGraph到目前为止还不支持庞大的矩阵。

代码语言:javascript
复制
File "/home/lam/.local/lib/python3.6/site-packages/stellargraph/core/graph.py", line 182, in _convert_from_node_data
data_arr = arr.values.astype(dtype)

从代码开始到这里,所有的数据都存储为稀疏数组,这不会占用太多的内存。在这里,arr应该是一个DataFrame,列作为pandas.SparseArray。这一行代码将数据结构转换为正常的numpy数组,这会使内存使用崩溃。

代码语言:javascript
复制
import numpy as np
a = np.empty((158950,14450),float)
print(a.nbytes/2**30)
17.112698405981064

这里的空numpy数组实际上占用了17G内存。我可以在我的16G电脑上初始化3个数组。然后我得到内存错误,如果我试图得到超过3,而且我不能初始化一个158,950 x 158,950 numpy数组。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59119420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档