似乎我可以通过创建 mmap'd ndarray 并使用它来初始化系列来为 python 系列的基础数据进行内存映射。
def assert_readonly(iloc):
try:
iloc[0] = 999 # Should be non-editable
raise Exception("MUST BE READ ONLY (1)")
except ValueError as e:
assert "read-only" in e.message
# Original ndarray
n = 1000
_arr = np.arange(0,1000, dtype=float)
# Convert it to a memmap
mm = np.memmap(filename, mode='w+', shape=_arr.shape, dtype=_arr.dtype)
mm[:] = _arr[:]
del _arr
mm.flush()
mm.flags['WRITEABLE'] = False # Make immutable!
# Wrap as a series
s = pd.Series(mm, name="a")
assert_readonly(s.iloc)
成功!它似乎s
由只读的 mem 映射的 ndarray 支持。我可以对 DataFrame 做同样的事情吗?以下失败
df = pd.DataFrame(s, copy=False, columns=['a'])
assert_readonly(df["a"]) # Fails
以下成功,但仅针对一列:
df = pd.DataFrame(mm.reshape(len(mm,1)), columns=['a'], copy=False)
assert_readonly(df["a"]) # Succeeds
...所以我可以在不复制的情况下制作 DF。但是,这只适用于一列,我想要很多。我发现用于组合 1 列 DF 的方法: pd.concat(..copy=False), pd.merge(copy=False), ... 导致副本。
我有数千个大列作为数据文件,我一次只需要几个。我希望我能够将他们的 mmap 表示放在上面的 DataFrame 中。是否可以?
Pandas 文档让人有点难以猜测这里到底发生了什么——尽管它确实说 DataFrame “可以被认为是 Series 对象的类似 dict 的容器”。. 我开始这不再是这种情况。
我宁愿不需要 HD5 来解决这个问题。