为什么我不能重塑 numpy 字符串数组和 ctype 数组?

Why can't I reshape numpy string arrays and ctype arrays?

也许我缺少解决此问题的方法。长话短说,我需要一个大文本文件的只读共享内存访问。使用字符串当然是必要的。所以我正在尝试这样做:

import numpy
from multiprocessing import Pool, RawArray

if __name__ == '__main__':
    with open('test.txt', 'r') as fin:
        raw = fin.readlines()
    X_shape = (len(raw), 70) # 70 characters per line should be sufficient for my needs
    X = RawArray('c', X_shape[0] * X_shape[1])
    X_np = np.frombuffer(X).reshape(X_shape)
    numpy.copyto(X_np, raw)

这不起作用,它在倒数第二行失败,输出如下:

ValueError: cannot reshape array of size 102242175 into shape (11684820,70)

作为参考,文件示例的长度为 11684820 行。并且 11684820 * 70 绝对不是数组声称其大小适合的字符数。

显然我一定是做错了什么,但这是我认为唯一可行的方法,可以使用低端几百兆字节的文本文件的文本文件输入来多处理一些 CPU 绑定计算,并且高端大约 6 GB。

是否有变通办法,或者是否有更正确的方法,以便我可以在共享内存中拥有大量字符串,我可以使用 python 代码?谢谢

numpy.frombuffer 需要明确的 dtype,否则它将默认为 dtype=float。此外,一个 11684820x70 的 uint8 数组或 1 个字符的字节串与一个长度为 11684820 的 70 个字符的字节串数组不同,所以请记住这一点。

对于 11684820x70 阵列,您要求的形状,但可能不是您需要的形状:

X_np = np.frombuffer(X, dtype=np.uint8).reshape(X_shape)

对于 dtype S70 的长度为 11684820 的数组(最大长度为 70 的空终止字节串,在 NumPy 文档中描述为 "not recommended"):

X_np = np.frombuffer(X, dtype='S70')

对于长度为 11684820 的 dtype U70 数组(最大长度为 70 的空终止 Unicode 字符串),您需要更大的缓冲区(每个字符 4 个字节),然后

X_np = np.frombuffer(X, dtype='U70')