<p>你可以试着用一个<a href="https://docs.python.org/2/library/stdtypes.html#memoryview" rel="nofollow">memoryview</a>,伊莱本德斯基写了一个很好的<a href="http://eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-protocol-and-memoryviews" rel="nofollow">blog entry</a>。在</p>
<p>不过,我会尽力总结一下。在对象上创建memoryview时,您正在创建对存储对象的内存中的(ctype)数据结构的引用。memoryview切片是在该数据结构中查找某些值的引用。无需在同一结构上复制多个基础视图即可。这就像对列表或数组进行切片一样。在</p>
<p>但是,您的数据必须支持缓冲区协议(numpy数组和bytearray可以做到这一点,但是列表不支持)。在</p>
<p>我想加上这一行就足够了</p>
<pre><code>memview = memoryview(yourarray)
</code></pre>
<p>并将其传递给split而不是数组。在</p>
<p>不过,请注意两件事:</p>
<ul>
<li>您正在处理一个大数组,因此对数组的一部分(在一个切片中进行)的更改会传播到覆盖该值的所有其他切片。在</li>
<li>您的结果现在是memoryview对象。要打印它们,您需要先将其强制转换(例如,将其转换为列表)。在</li>
</ul>
<p>示例:</p>
^{pr2}$
<p>当然,所有这些都是假设您可以在一个时间点将50GB加载到内存中。如果您不能这样做,您应该看看<a href="https://docs.python.org/2/library/mmap.html" rel="nofollow">mmap</a>模块。在</p>
<h2>编辑-字符串的numpy数组</h2>
<blockquote>
<p>Will memoryview work with a numpy array of strings?</p>
<p>seems not. e.g. <code>memview = memoryview(np.array(["abcde", 'aa']))</code>, <code>memview[0] is 'abcde'</code>, but <code>memview[1]</code> is <code>'aa\x00\x00\x00'</code></p>
</blockquote>
<p>好吧,从技术上讲,它确实有效。它只是展示了numpy如何存储字符串数组。那就是:糟糕;)</p>
<p>如果像这样创建一个由字符串组成的numpy数组:</p>
<pre><code>>>> npa = np.array(["abcde", 'aa'])
>>> print repr(npa)
array(['abcde', 'aa'],
dtype='|S5')
</code></pre>
<p>您可以看到dtype是<code>|S5</code>,表示长度为5的字符串。较短字符串的“missing”位置用空(零)字节(<code>\x00</code>)填充(numpy通常为方便起见而隐藏这些字节)。这是因为numpy使用一个连续的2D数组将字符串存储在内存中,以允许真正快速的随机访问。在</p>
<p>这意味着,数组中的所有条目消耗的内存与最长的字符串相同。<br/>
把这个高度构造的数组想象成一个极端的例子:</p>
<pre><code>strings = ["foobar"*100000] + ["f" for _ in xrange(10000)]
huge_npa = np.array(strings, dtype=str)
</code></pre>
<p>它包含一个非常长的字符串(600.000个字符,每个1个字节)和10.000个只有1个字节的字符串。所以总内存消耗应该在600KB左右。如果您创建这个数组,尽管它占用了<strong>6GB</strong>内存。在</p>
<pre><code>Expected:
1 string * 6 bytes * 100.000 => 600.000 * 1 byte = 600 KB
10.000 strings * 1 byte => 10.000 * 1 byte = 10 KB
total 610 kB
Reality:
10.000 strings * 6 bytes * 10.0000 => 6.000.000.000 * 1 byte = 6 GB
</code></pre>
<p>如果你的字符串在大小上有很大的不同,你可能在这里浪费了大量的内存。也许你应该重新考虑使用numpy数组。在</p>