擅长:python、mysql、java
<h2>快速回答</h2>
<ul>
<li><a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html" rel="nofollow">Numpuy.memmap</a>允许在磁盘上以numpy数组的形式呈现一个大文件。不知道它是否允许映射大于RAM+swap的文件。值得一试。在</li>
<li>[关于Python内存不足的演示](<a href="http://hilpisch.com/TPQ_Out_of_Memory_Analytics.html" rel="nofollow">http://hilpisch.com/TPQ_Out_of_Memory_Analytics.html</a>)</li>
</ul>
<h2>更长的答案</h2>
<p>一个关键问题是您有多少RAM(10GB,>10GB)以及您正在进行什么样的处理(需要查看数据集中的每个元素一次,或者需要一次查看整个数据集)。在</p>
<p>如果它是<;10GB并且需要查看一次,那么您的方法似乎是最合适的方法。这是处理大于主存的数据集的标准方法。我要做的是将一个块的大小从500kb增加到更接近你的内存量-也许是物理RAM的一半,但无论如何,在GB范围内,但不足以导致交换到磁盘和干扰你的算法。一个很好的优化方法是同时在内存中保存两个块。一个正在处理,另一个从磁盘并行加载。这是因为从磁盘加载数据相对比较昂贵,但不需要太多CPU工作—CPU基本上是在等待数据加载。在Python中很难做到,因为GIL,但是numpy和朋友们不应该受到影响,因为他们在数学运算期间发布GIL。<code>threading</code>包在这里可能很有用。在</p>
<p>如果RAM较低,需要同时查看整个数据集(可能在计算一些二次时间ML算法时,甚至在数据集中执行随机访问时),事情会变得更复杂,而且您可能无法使用前面的方法。要么将算法升级为线性算法,要么需要实现一些逻辑,使numpy等中的算法直接处理磁盘上的数据,而不是将其存储在RAM中。在</p>
<p>如果您有大于10GB的RAM,您可能会让操作系统为您完成这项艰巨的工作,并将交换大小增加到足以捕获所有数据集。通过这种方式,所有的东西都被加载到虚拟内存中,但是只有一个子集被加载到物理内存中,操作系统处理它们之间的转换,所以所有东西看起来就像一个巨大的RAM块。但是如何增加它是操作系统特有的。在</p>