2016-08-06 6 views
0

numpy.fromfile의 단일 호출을 사용하여 읽으려는 이진 파일에 여러 블록이 있습니다. 여기numpy.fromfile을 사용하여 분산 된 이진 데이터 읽기

OES=[ 
('EKEY','i4',1), 
('FD1','f4',1), 
('EX1','f4',1), 
('EY1','f4',1), 
('EXY1','f4',1), 
('EA1','f4',1), 
('EMJRP1','f4',1), 
('EMNRP1','f4',1), 
('EMAX1','f4',1), 
('FD2','f4',1), 
('EX2','f4',1), 
('EY2','f4',1), 
('EXY2','f4',1), 
('EA2','f4',1), 
('EMJRP2','f4',1), 
('EMNRP2','f4',1), 
('EMAX2','f4',1)] 

을 바이너리의 형식 : 각 블록의 형식은 다음과

Data I want (OES format repeating n times) 
------------------------ 
Useless Data 
------------------------ 
Data I want (OES format repeating m times) 
------------------------ 
etc.. 

내가 원하는 데이터와 쓸모없는 데이터 사이의 바이트 증가를 알고있다. 또한 각 데이터 블록의 크기를 알고 있습니다.

지금까지 내가 전화 한 다음 파일 객체 f에 노력하여 내 목표를 달성했다 :

nparr = np.fromfile(f,dtype=OES,count=size) 

그래서 내가 원하는 각 데이터 블록에 대해 다른 nparr을 가지고 하나에 모든 numpy 배열을 연결된 새로운 배열.

내 목표는 연결하지 않고 원하는 (메모리 용도로) 모든 블록이있는 단일 배열을 갖는 것입니다. 즉, nparr = np.fromfile(f,dtype=OES) 번만 전화하고 싶습니다. 이 목표를 달성 할 수있는 방법이 있습니까?

답변

2

nparr = np.fromfile(f,dtype=OES)으로 전화를 걸고 싶습니다. 이 목표를 달성 할 수있는 방법이 있습니까?

아니요, fromfile()으로의 단일 호출이 아닙니다.

미리 파일의 전체 레이아웃을 알고 있다면 배열을 미리 할당 한 다음 fromfileseek을 사용하여 OES 블록을 사전 할당 된 배열로 직접 읽을 수 있습니다. 예를 들어 각 OES 블록의 파일 위치를 알고 있고 각 블록의 레코드 수를 알고 있다고 가정합니다. (f 가정하면 이미 열려있는 파일이)

file_positions = [position1, position2, ...] 
numrecords = [n1, n2, ...] 

이 그럼 당신은 같은 것을 할 수있다 : 즉, 당신은 알고있다

total = sum(numrecords) 
nparr = np.empty(total, dtype=OES) 
current_index = 0 
for pos, n in zip(file_positions, numrecords): 
    f.seek(pos) 
    nparr[current_index:current_index+n] = np.fromfile(f, count=n, dtype=OES) 
    current_index += n 
+0

대단히 감사합니다! 나는 이것도 고려하고 있었다. 메모리가 어떻게 관리되고 있는지 나는 조금 퍼지다. 이것은 np.fromfile과 nparr에서 중복 된 메모리를 생성하지 않습니다? nparr 하위 집합이 np.fromfile을 볼 수 있습니까? 아니면 복사본? 내 테스트를 토대로, 그것과 같은 항목 할당이 복사본을 만드는 것처럼 보입니다. 하지만 나는 틀렸어. 멋진 제안에 감사드립니다. – snowleopard

+1

각 블록에 대해'fromfile (f, count = n, dtype = OES)'는 길이가'n' 인 배열을 생성합니다. 그런 다음 해당 배열은'nparr'의 적절한 범위에 복사됩니다. 'fromfile'에 의해 생성 된 배열은 다른 곳에서는 할당되지 않으므로 파이썬에서 메모리를 재사용 할 수 있습니다. –

+0

당신은 사용할 수 없다는 것을 의미합니까? 파이썬의 가비지 컬렉터에 대한 필자의 글을 기반으로, 당신이 의미하는 바를 완벽하게 이해할 수있을 것입니다. – snowleopard