fromfile
์ ํจํ์ง ์์ ๋ฐ์ดํฐ ๋ฐ ํ์ผ์ ๋์ ์ง๋์ ์ฝ๋ ๊ฒฝ์ฐ ๊ฐ๋ segfault๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ, ์ฝ๊ธฐ๊ฐ ํ์ผ ๋์ ์ง๋๊ฐ ์ง ํ์ธํ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ Ubuntu 16.04์์ segfault๋ก ์ด์ด์ง์ง ๋ง OSX์์๋ segfault๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
import numpy as np
def test_read_from_file():
# create an empty file named `empty.bin`
filename = 'empty.bin'
open(filename, 'a').close()
# read large chunk of data, past the end of the file
dtype = [('data', '<f4', 500,)]
count = 100000000
with open(filename, 'rb') as fh:
data = np.fromfile(fh, dtype, count)
print(data.shape)
ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ ์ฝ๋ 139๋ก ์๋ฃ๋์์ต๋๋ค (์ ํธ 11 : SIGSEGV์ ์ํด ์ค๋จ๋จ).
ํ๋ซํผ ๋ฆฌ๋ ์ค-Python 3.6.6, pytest-3.8.2, py-1.6.0, pluggy-0.7.1
์ฐธ๊ณ ๋ก 1.15.3์์ ์ฌํ ๊ฐ๋ฅํฉ๋๋ค. ํฌ๊ธฐ๋ฅผ ์๊ณ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ ์ฒด ํ์ผ์ ์ฝ์ด์ผํฉ๋๋ค. ์ด๊ฒ์ด ์ผ๋ถ ์์คํ ์์ ์กฐ์ฉํ ์๋ํ๋ค๋ฉด, ๋ง์ผ์ ๋๋นํ์ฌ ๋ฆด๋ฆฌ์ค ๋ ธํธ๋ฅผ ๋ฃ์ด์ผ ํ ๊ฒ์ ๋๋ค (๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ๊ณ ์น ์ ์๋ค๊ณ ๋งํ ๊ฒ์ ๋๋ค).
ํธ์ง : ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ธ๋ฑ์ฑ ๋๋ฌธ์ ์ ์ฒด ํ์ผ์ด ์ต์ ์ผ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ธ๋ฑ์ฑ์ ์ด์ ๊ด๋ จํ์ฌ ์ฝ๊ฐ ํน๋ณํฉ๋๋ค.
๋์ํฉ๋๋ค. ์ค๋ฅ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ์ด ์ข์ ์๊ฐ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ถ๋ถ ์ฝ๊ธฐ์ ๋ํด์๋ ์ฌ์ ํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค.
fromfile
์ count
์ ๋๋ฌ ํ ๋๊น์ง ๊ฐ๋ฅํ ํ ๋ง์ ๋ฐ์ดํฐ ๋ ์ฝ๋๋ฅผ ์ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝ์ ์ค์ ๋ ์ฝ๋ ์๋ฅผ ๋ช
์ ์ ์ผ๋ก ๋ฐํํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค (์์ ์ ์ผ๋ก ์ด๊ฒ์ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ํํ๋ก ๋ณด์ฌ์ผํฉ๋๋ค). ์ ์์ ์ธ ์ฌ์ฉ ์๋๋ฆฌ์ค๊ฐ ์๋๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.์ด๋ค ์๋๋ฆฌ์ค๊ฐ numpy ์ฒ ํ์ ๋ ์ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฒซ ๋ฒ์งธ ์ต์ ์ด ๋ ์ ์ฉํ๊ฒ ๋ค๋ฆฝ๋๋ค.
์ค๋ฅ๊ฐ ๊ฐ์ฅ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์ง๊ธ ํ์ ํ์ง ๋ชปํ๋ ๊ฒ์ fromfile์ด ์๋ ค์ง ํฌ๊ธฐ๊ฐ์๋ ๊ฐ์ฒด์ ๊ฐ์ ํ์ผ์ ์ง์ํ๋์ง ๋๋ ๋น์ด ์์ง ์์ sep kwarg์ ๊ฒฝ์ฐ ํ์ฌ ๋ฐ์ํ๋ ์ผ์ ๋๋ค.
@amuresan fromfile ์ ์ฝ๋๋ C๋ก๋์ด ์์ง๋ง, ์๊ฐ์ด ์กฐ๊ธ ์๋ค๋ฉด ํญ์ pull request์ ๋ง์กฑํ๊ณ ์์ผ๋ฉฐ C (Python) API์ ์กฐ๊ธ๋ง ๋ค์ด๊ฐ๋ ๊ฒ์ ํฉ๋ฆฌ์ ์ธ ์ด๋ ค์์ฒ๋ผ ๋ณด์ ๋๋ค.
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ค์ ๋ก ์ฐ๋ถํฌ์์ ์๋ชป ์ฒ๋ฆฌ๋๊ณ segfault๋ฅผ ์ผ์ผํค๋ MemoryError
๋ฅผ ์ป๋๋ค๋ ๊ฒ์
๋๋ค.
์์ ๋ PR์ ์ฌ๊ธฐ : https://github.com/numpy/numpy/pull/12354
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ค์ ๋ก ์ฐ๋ถํฌ์์ ์๋ชป ์ฒ๋ฆฌ๋๊ณ segfault๋ฅผ ์ผ์ผํค๋
MemoryError
๋ฅผ ์ป๋๋ค๋ ๊ฒ์ ๋๋ค.์์ ๋ PR์ ์ฌ๊ธฐ : https://github.com/numpy/numpy/pull/12354