Tôi thường xuyên sử dụng hàng chục gigabyte dữ liệu chỉ trong thời trang này. G. Tôi có các bảng trên đĩa mà tôi đọc qua truy vấn, tạo dữ liệu và nối lại.
Bạn nên đọc các tài liệu và cuối chuỗi này để biết một số gợi ý về cách lưu trữ dữ liệu của bạn.
Các chi tiết sẽ ảnh hưởng đến cách bạn lưu trữ dữ liệu của mình, chẳng hạn như:
Cung cấp càng nhiều chi tiết càng tốt; và tôi có thể giúp bạn phát triển cấu trúc.
- Kích thước của dữ liệu, số hàng, cột, loại cột; bạn là phần phụ hay chỉ là cột?
- Các hoạt động điển hình sẽ như thế nào. Ví dụ. thực hiện truy vấn trên các cột để chọn một loạt các hàng và cột cụ thể, sau đó thực hiện một thao tác (trong bộ nhớ), tạo các cột mới, lưu các cột này.
(Đưa ra một ví dụ về đồ chơi có thể cho phép chúng tôi đưa ra các đề xuất cụ thể hơn. ) - Sau quá trình xử lý đó, bạn sẽ làm gì? Bước 2 là đặc biệt hay có thể lặp lại?
- Nhập tệp phẳng:bao nhiêu, tổng kích thước thô tính bằng Gb. Chúng được tổ chức như thế nào, v.d. bằng hồ sơ? Mỗi cái có chứa các trường khác nhau hay chúng có một số bản ghi trên mỗi tệp với tất cả các trường trong mỗi tệp?
- Bạn có bao giờ chọn tập hợp con của các hàng (bản ghi) dựa trên tiêu chí (ví dụ:chọn các hàng có trường A> 5) không? rồi làm gì đó hay bạn chỉ chọn các trường A, B, C với tất cả các bản ghi (rồi làm gì đó)?
- Bạn có 'làm việc trên' tất cả các cột của mình (theo nhóm) không hay có một tỷ lệ tốt mà bạn có thể chỉ sử dụng cho các báo cáo (ví dụ:bạn muốn giữ lại dữ liệu, nhưng không cần phải kéo vào đó tính rõ ràng của cột cho đến thời gian kết quả cuối cùng)?
Giải pháp
Đảm bảo bạn có gấu trúc ít nhất 0.10.1
đã cài đặt.
Đọc các tệp lặp lại từng đoạn và nhiều truy vấn bảng.
Vì pytables được tối ưu hóa để hoạt động theo hàng (là thứ bạn truy vấn), chúng tôi sẽ tạo một bảng cho từng nhóm trường. Bằng cách này, thật dễ dàng để chọn một nhóm trường nhỏ (sẽ hoạt động với một bảng lớn, nhưng sẽ hiệu quả hơn nếu làm theo cách này ... Tôi nghĩ tôi có thể khắc phục hạn chế này trong tương lai ... đây là trực quan hơn dù sao):
(Sau đây là mã giả.)
import numpy as np
import pandas as pd
# create a store
store = pd.HDFStore('mystore.h5')
# this is the key to your storage:
# this maps your fields to a specific group, and defines
# what you want to have as data_columns.
# you might want to create a nice class wrapping this
# (as you will want to have this map and its inversion)
group_map = dict(
A = dict(fields = ['field_1','field_2',.....], dc = ['field_1',....,'field_5']),
B = dict(fields = ['field_10',...... ], dc = ['field_10']),
.....
REPORTING_ONLY = dict(fields = ['field_1000','field_1001',...], dc = []),
)
group_map_inverted = dict()
for g, v in group_map.items():
group_map_inverted.update(dict([ (f,g) for f in v['fields'] ]))
Đọc trong tệp và tạo bộ nhớ (về cơ bản làm những gì append_to_multiple
hiện):
for f in files:
# read in the file, additional options may be necessary here
# the chunksize is not strictly necessary, you may be able to slurp each
# file into memory in which case just eliminate this part of the loop
# (you can also change chunksize if necessary)
for chunk in pd.read_table(f, chunksize=50000):
# we are going to append to each table by group
# we are not going to create indexes at this time
# but we *ARE* going to create (some) data_columns
# figure out the field groupings
for g, v in group_map.items():
# create the frame for this group
frame = chunk.reindex(columns = v['fields'], copy = False)
# append it
store.append(g, frame, index=False, data_columns = v['dc'])
Bây giờ bạn có tất cả các bảng trong tệp (thực sự bạn có thể lưu trữ chúng trong các tệp riêng biệt nếu muốn, bạn có thể phải thêm tên tệp vào group_map, nhưng có lẽ điều này là không cần thiết).
Đây là cách bạn lấy các cột và tạo các cột mới:
frame = store.select(group_that_I_want)
# you can optionally specify:
# columns = a list of the columns IN THAT GROUP (if you wanted to
# select only say 3 out of the 20 columns in this sub-table)
# and a where clause if you want a subset of the rows
# do calculations on this frame
new_frame = cool_function_on_frame(frame)
# to 'add columns', create a new group (you probably want to
# limit the columns in this new_group to be only NEW ones
# (e.g. so you don't overlap from the other tables)
# add this info to the group_map
store.append(new_group, new_frame.reindex(columns = new_columns_created, copy = False), data_columns = new_columns_created)
Khi bạn sẵn sàng cho post_processing:
# This may be a bit tricky; and depends what you are actually doing.
# I may need to modify this function to be a bit more general:
report_data = store.select_as_multiple([groups_1,groups_2,.....], where =['field_1>0', 'field_1000=foo'], selector = group_1)
Về data_columns, bạn thực sự không cần xác định BẤT KỲ cột_dữ_liệu; chúng cho phép bạn chọn phụ các hàng dựa trên cột. Ví dụ. một cái gì đó như:
store.select(group, where = ['field_1000=foo', 'field_1001>0'])
Chúng có thể thú vị nhất đối với bạn trong giai đoạn tạo báo cáo cuối cùng (về cơ bản một cột dữ liệu được tách biệt khỏi các cột khác, điều này có thể ảnh hưởng phần nào đến hiệu quả nếu bạn xác định nhiều).
Bạn cũng có thể muốn:
- tạo một hàm lấy danh sách các trường, tra cứu các nhóm trong groups_map, sau đó chọn các trường này và nối các kết quả lại để bạn có được khung kết quả (về cơ bản đây là những gì select_as_multiple làm). Bằng cách này, cấu trúc sẽ khá minh bạch đối với bạn.
- lập chỉ mục trên các cột dữ liệu nhất định (giúp việc thiết lập con hàng nhanh hơn nhiều).
- bật tính năng nén.
Hãy cho tôi biết khi bạn có thắc mắc!