2013-12-16 20 views
11

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.

+7

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

+2

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. –

+1

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

Trả lời

0

được rồi, vì vậy tôi không có nhiều kinh nghiệm với cơ sở dữ liệu oracle, nhưng đây là một vài suy nghĩ:

Thời gian truy cập của bạn đối với bất kỳ bản ghi cụ thể nào từ oracle chậm, do thiếu lập chỉ mục và thực tế bạn muốn dữ liệu theo thứ tự dấu thời gian.

Thứ nhất, bạn không thể bật lập chỉ mục cho cơ sở dữ liệu?

Nếu bạn không thể thao tác cơ sở dữ liệu, bạn có thể yêu cầu một bộ tìm thấy chỉ bao gồm các id duy nhất được đặt hàng cho mỗi hàng?

Bạn có khả năng lưu trữ dữ liệu này dưới dạng một mảng duy nhất các id duy nhất và bạn sẽ có thể vừa với bộ nhớ. Nếu bạn cho phép 4k cho mỗi khóa duy nhất (ước tính bảo thủ, bao gồm chi phí vv) và bạn không giữ dấu thời gian, vì vậy nó chỉ là một mảng số nguyên, nó có thể sử dụng khoảng 1,1 GB RAM cho 3 triệu bản ghi. Đó không phải là một đống toàn bộ, và có lẽ bạn chỉ muốn một cửa sổ nhỏ của dữ liệu hoạt động, hoặc có lẽ bạn đang xử lý hàng theo hàng?

Tạo chức năng của trình tạo để thực hiện tất cả điều này.Bằng cách đó, một khi bạn hoàn thành việc lặp lại, nó sẽ giải phóng bộ nhớ, mà không cần phải xóa bất cứ thứ gì, và nó cũng làm cho mã của bạn dễ dàng hơn để theo dõi và tránh làm bùng nổ logic quan trọng thực tế của vòng lặp tính toán của bạn.

Nếu bạn không thể lưu trữ tất cả trong bộ nhớ, hoặc vì một số lý do khác không hiệu quả, thì điều tốt nhất bạn có thể làm là tính toán số lượng bạn có thể lưu trữ trong bộ nhớ. Bạn có khả năng phân chia công việc thành nhiều yêu cầu và sử dụng đa luồng để gửi yêu cầu sau khi yêu cầu cuối cùng kết thúc, trong khi bạn xử lý dữ liệu vào tệp mới của mình. Nó không nên sử dụng hết bộ nhớ, cho đến khi bạn yêu cầu dữ liệu được trả về. Hãy thử và làm việc ra nếu sự chậm trễ là yêu cầu được hoàn thành, hoặc dữ liệu được tải xuống.

Từ âm thanh của nó, bạn có thể đang trừu tượng hóa cơ sở dữ liệu và cho phép gấu trúc thực hiện các yêu cầu. Nó có thể là giá trị xem làm thế nào nó hạn chế kết quả. Bạn sẽ có thể thực hiện yêu cầu cho tất cả dữ liệu, nhưng chỉ tải kết quả một hàng tại một thời điểm từ máy chủ cơ sở dữ liệu.

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