2013-05-19 20 views
5

Tôi có một DataFrame trong Pandas:Không thể lưu DataFrame để HDF5 ("Thông điệp tiêu đề đối tượng là quá lớn")

In [7]: my_df 
Out[7]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 34 entries, 0 to 0 
Columns: 2661 entries, airplane to zoo 
dtypes: float64(2659), object(2) 

Khi tôi cố gắng tiết kiệm này vào đĩa:

store = pd.HDFStore(p_full_h5) 
store.append('my_df', my_df) 

tôi get:

File "H5A.c", line 254, in H5Acreate2 
    unable to create attribute 
    File "H5A.c", line 503, in H5A_create 
    unable to create attribute in object header 
    File "H5Oattribute.c", line 347, in H5O_attr_create 
    unable to create new attribute in header 
    File "H5Omessage.c", line 224, in H5O_msg_append_real 
    unable to create new message 
    File "H5Omessage.c", line 1945, in H5O_msg_alloc 
    unable to allocate space for message 
    File "H5Oalloc.c", line 1142, in H5O_alloc 
    object header message is too large 

End of HDF5 error back trace 

Can't set attribute 'non_index_axes' in node: 
/my_df(Group) u''. 

Tại sao?

Lưu ý: Trong trường hợp vấn đề, các tên cột DataFrame rất đơn giản chuỗi nhỏ:

In[12]: max([len(x) for x in list(my_df.columns)]) 
Out{12]: 47 

Đây là tất cả với Pandas 0.11 và phiên bản ổn định mới nhất của IPython, Python và HDF5.

+0

vấn đề là chỉ mục của bạn. tất cả đều là 0? điều đó thật kỳ quặc. bạn có thể hiển thị mẫu khung của bạn không? – Jeff

+0

nói chung bạn muốn có nhiều hàng hơn cột; hdf5 dựa trên hàng. thử lưu trữ việc chuyển đổi khung hình của bạn – Jeff

Trả lời

7

HDF5 có giới hạn tiêu đề là 64kb cho tất cả siêu dữ liệu của các cột. Điều này bao gồm tên, loại, v.v. Khi bạn đi khoảng 2000 cột, bạn sẽ hết dung lượng lưu trữ tất cả siêu dữ liệu. Đây là một hạn chế cơ bản của pytables. Tôi không nghĩ họ sẽ sớm giải quyết vấn đề của họ. Bạn sẽ phải chia bảng hoặc chọn một định dạng lưu trữ khác.

+0

Cảm ơn @ BrianWang0. Xem xét vấn đề của tôi, bạn có bất cứ gợi ý nào cho các lựa chọn thay thế cho HDF5 không? –

+0

Bạn có quan tâm đến việc truy vấn hoặc phụ thuộc hoặc nén không? Hãy thử và gọi 'my_df.to_hdf (output_name, 'my_df', format = 'f')'. Tôi không phải là một chuyên gia trong PyTables, nhưng nó làm việc cho tôi khi tôi có số lượng cột khổng lồ. Định dạng _fixed_ nào đó không có giới hạn này như định dạng _table_. Đây là cách khắc phục dễ nhất cho tôi. – BrianWang0

+1

Hoặc bạn có thể chia bảng, như trong việc tạo nhiều khung dữ liệu trong một khung dữ liệu. Mỗi khung dữ liệu có một tập con của tất cả các cột. Lưu từng khung dữ liệu vào một HDF5store. Hoặc chỉ cần viết nó vào một văn bản thuần túy csv, nếu bạn chỉ muốn giải pháp đơn giản nhất. Một lần nữa, tôi không phải là một chuyên gia. Một người khác có thể đưa ra một gợi ý tốt hơn tôi nhiều. – BrianWang0

4

Tính đến năm 2014, HDF là updated

 
If you are using HDF5 1.8.0 or previous releases, there is a limit on the number 
of fields you can have in a compound datatype. 
This is due to the 64K limit on object header messages, into which datatypes are encoded. (However, you can create a lot of fields before it will fail. 
One user was able to create up to 1260 fields in a compound datatype before it failed.) 

Đối với pandas, nó có thể tiết kiệm Dataframe với số arbirtary cột với format='fixed' lựa chọn, định dạng 'bảng' vẫn còn gây những lỗi tương tự như trong chủ đề. Tôi cũng đã thử h5py và gặp lỗi 'tiêu đề quá lớn' (mặc dù tôi có phiên bản> 1.8.0).

Các vấn đề liên quan