Tôi đang làm việc với một cơ sở dữ liệu Oracle với hàng triệu hàng và hơn 100 cột. Tôi đang cố gắng để lưu trữ dữ liệu này trong một tập tin HDF5 bằng cách sử dụng pytables với một số cột được lập chỉ mục. Tôi sẽ đọc tập con của những dữ liệu này trong một DataFrame gấu trúc và thực hiện tính toán.Đọc một bảng lớn với hàng triệu hàng từ Oracle và viết tới HDF5
tôi đã cố gắng như sau:
Tải bảng, sử dụng một tiện ích vào một tập tin csv, đọc file csv đoạn bởi đoạn sử dụng gấu trúc và thêm vào bảng HDF5 sử dụng pandas.HDFStore
. Tôi tạo ra một định nghĩa dtype và cung cấp các kích thước chuỗi tối đa.
Tuy nhiên, bây giờ khi tôi đang cố gắng tải xuống dữ liệu trực tiếp từ Oracle DB và đăng nó lên tệp HDF5 qua pandas.HDFStore
, tôi gặp phải một số sự cố.
pandas.io.sql.read_frame không hỗ trợ đọc chunked. Tôi không có đủ RAM để có thể tải toàn bộ dữ liệu xuống bộ nhớ trước.
Nếu tôi cố gắng sử dụng cursor.fecthmany()
với số bản ghi cố định, hoạt động đọc mất độ tuổi tại bảng DB không được lập chỉ mục và tôi phải đọc các bản ghi nằm trong phạm vi ngày. Tôi đang sử dụng DataFrame(cursor.fetchmany(), columns = ['a','b','c'], dtype=my_dtype)
tuy nhiên, DataFrame được tạo luôn luôn nhập dtype thay vì thực thi dtype mà tôi đã cung cấp (không giống như read_csv tuân thủ dtype mà tôi cung cấp). Do đó, khi tôi thêm DataFrame này vào một hiện tại đã có sẵn HDFDatastore
, có một loại không khớp cho ví dụ: float64 có thể được hiểu là int64 trong một đoạn.
Đánh giá cao nếu các bạn có thể đưa ra suy nghĩ và chỉ cho tôi đúng hướng.
cách tiếp cận hiện tại của bạn (với csv) và sửa dtype là đúng. SQL sẽ nhận được một bản cập nhật lớn trong 0,14 (0,13 phát hành ngay). Vì vậy, không may dtype infererence/chunking là không có sẵn. Xin chào PRS! xem vấn đề này: https://github.com/pydata/pandas/issues/4163 – Jeff
Tôi khuyên bạn nên xóa thẻ Oracle trừ khi bạn gặp phải bất kỳ sự cố nào về phía Oracle của sự vật. –
Bạn nên yêu cầu dba chuyển đổi bảng thành đối tượng được phân đoạn theo phạm vi, sau đó phải dễ dàng truy cập theo phân vùng – klashxx