2016-10-14 5 views
0

서버에서 큰 데이터 배열을 가져옵니다. 사전과 다차원 배열의 조합으로 저장하고 간단한 플롯에 사용됩니다. 다음과 같이 보입니다 :큰 배열을 포함하는 데이터 구조를 읽고 쓰려면 어떻게해야합니까?

>> print(data) 
{'intensity_b2': [array([ 1.46562588e+09, 1.46562588e+09, 1.46562588e+09, ..., 
    1.46566369e+09, 1.46566369e+09, 1.46566369e+09]), array([ 0., 0., 0., ..., 0., 0., 0.])]} 
>> print(len(data['intensity_b2'][0])) 
37071 

스크립트를 실행할 때마다 데이터를 가져 오지 않으려면이 데이터 구조를 파일에 저장하고 싶습니다. 나는

with open("data.dat", 'w') as f: 
    f.write(str(data)) 

로 데이터를 저장하고 here을 제안

with open(data_store, 'r') as f: 
    data = ast.literal_eval(f.read()) 

로 그것을 읽어보십시오. 그러나, 나는 내가 (즉, 위의 첫 번째 print(data)이 데이터를 찾습니다되어 말 그대로 어떻게 최초의 인쇄물에 표시되었을 때 데이터가 ...와 함께 저장됩니다 때문이다 의심 오류

ValueError: malformed node or string: <_ast.Call object at 0x108fce5f8>

를 얻을 파일). 큰 배열을 가진 사전을 파일에 쓰고 그 후에 읽으려면 어떻게해야합니까?

답변

1

당신은 제대로 직렬화를 처리 할 수 ​​pickle를 사용할 수 있습니다

In [23]: a 
Out[23]: 
{'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]), 
    array('f', [1465663744.0, 1465663744.0, 1465663744.0])]} 

In [24]: pickle.dump(a, open('foo.p', 'wb')) 

In [25]: aa = pickle.load(open('foo.p', 'rb')) 

In [26]: aa 
Out[26]: 
{'intensity_b2': [array('f', [1465625856.0, 1465625856.0, 1465625856.0]), 
    array('f', [1465663744.0, 1465663744.0, 1465663744.0])]} 

이 당신이 원하는 정확히 수행 : 파일에 데이터 구조를 저장하고 파일에서 읽습니다.

그러나 휠을 재발 명한 것 같습니다. numpypandas을보고 싶을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 어떻게 그렇게 바퀴를 재가공 하는가? 데이터는 플로팅 용으로 만 사용됩니다. – pingul

+1

제공된 detais에서 추측하면 원격 서버에서 데이터를받은 다음 중첩 된 배열 사전으로 변환 한 다음 파일에 저장합니다. 'pandas'와'numpy'는 큰 데이터 세트를 저장하기위한 매우 효율적인 데이터 구조를 제공합니다. 배열 사전을 만들 필요는 없으며'numpy.array' 또는'pandas.DataFrame'을 사용할 수 있습니다. 두 모듈 모두 serialization과 파일 저장을위한 도구가 내장되어 있으며'numpy'보다 상위 모듈 인'pandas '는 거의 모든 형식 (json, csv, ....)으로 데이터를 변환 할 수 있습니다. . –

+0

@pingul 그것은 서버에서 데이터를받는 것과 파일에 저장하는 것 (그리고 파이썬에서 플롯을 빌드하는지 여부)에 따라 다릅니다. 나는 당신이 약간의 데이터 조작을한다면,'pandas'는 이미 그것을위한 도구가 내장되어있을 수 있다고 말하고 있습니다. –

1

문제는 str이 데이터를 serialize하는 적절한 방법이 아닙니다. 일반적으로 객체는 인간이 자신이 무엇인지 이해할 수있는 문자열 표현을 갖습니다. 원시 객체의 경우 동일한 객체를 다시 얻으려면 eval 수있는 형식이 되겠지만 일반적으로 사실이 아닙니다.

데이터 직렬화 방법을 결정해야합니다. 과 같은 것을 사용할 수 있지만 어쨌든 원시 데이터 형식에서 개체를 변환하는 방법을 알아야 할 필요가 있습니다. 원시 데이터 형식을 사용하지 않는다는 것이 이미 분명하다고 생각합니다.

나중에 을 사용하여 나중에 다시 깜박임을 제거하고 동일한 데이터 형식을 다시 가져올 수있는 일련 화 된 데이터 버전을 만들려고합니다.

관련 문제