2018/11/09

[Python] mmap.flush で OSError が出る場合、アラインメントが不適切な可能性あり

Python の [mmap](https://docs.python.jp/3/library/mmap.html) は `flush()` を実行することで変更をディスクに保存します。

この `flush([offset[, size]])` を引数つきで呼ぶときは 「`offset` が `mmap.ALLOCATIONGRANULARITY` の倍数でないといけない」という制約がありますエラーメッセージにその旨出して欲しい。

つまり、以下のように、`offset` の位置を調整しないといけません。

```python
aligned_offset = int(offset / mmap.ALLOCATIONGRANULARITY) * mmap.ALLOCATIONGRANULARITY
mm.flush(aligned_offset, offset - aligned_offset + size)
```

> 参考
>
> [Issue 32798: mmap.flush() on Linux does not accept the "offset" and "size" args - Python tracker](https://bugs.python.org/issue32798)


`offset` の調整をしないと、`OSError` が発生してしまいます。
```
OSError: [Errno 22] Invalid argument
```

最初、このエラーが発生した時、指定した範囲が不正なんじゃないか等、無駄に調べてしまいました…

0 件のコメント: