2012-03-20 12 views
7

Tôi cần phải đọc toàn bộ bộ sưu tập từ MongoDB (tên bộ sưu tập là "kiểm tra") trong mã Python. Tôi đã cố gắng nhưLàm cách nào để đọc qua bộ sưu tập theo từng phần 1000?

self.__connection__ = Connection('localhost',27017) 
    dbh = self.__connection__['test_db']    
    collection = dbh['test'] 

Làm thế nào để đọc qua bộ sưu tập trong khối 1000 (để tránh tràn bộ nhớ vì bộ sưu tập có thể rất lớn)?

Trả lời

5

Sử dụng con trỏ. Con trỏ có biến "batchSize" kiểm soát số lượng tài liệu thực sự được gửi đến máy khách trên mỗi lô sau khi thực hiện truy vấn. Bạn không cần phải chạm vào thiết lập này mặc dù kể từ khi mặc định là tốt và phức tạp nếu gọi "getmore" lệnh được ẩn từ bạn trong hầu hết các trình điều khiển. Tôi không quen thuộc với pymongo nhưng nó hoạt động như thế này:

cursor = db.col.find() // Get everything! 

while(cursor.hasNext()) { 
    /* This will use the documents already fetched and if it runs out of documents in it's local batch it will fetch another X of them from the server (where X is batchSize). */ 
    document = cursor.next(); 

    // Do your magic here 
} 
+1

Bạn làm điều này bằng Python bằng cách nào? –

5

Tôi đồng ý với Remon, nhưng bạn đề cập đến hàng loạt 1000 câu trả lời của mình không thực sự đề cập đến. Bạn có thể đặt kích thước hàng loạt trên con trỏ:

cursor.batch_size(1000); 

Bạn cũng có thể bỏ qua hồ sơ, ví dụ .:

cursor.skip(4000); 

Đây có phải là những gì bạn đang tìm kiếm? Đây là mô hình phân trang hiệu quả. Tuy nhiên, nếu bạn chỉ cố gắng tránh tình trạng kiệt sức của bộ nhớ thì bạn không thực sự cần thiết lập kích thước lô hoặc bỏ qua.

0

Đối với tạo kết nối ban đầu hiện bằng Python 2 sử dụng Pymongo:

host = 'localhost' 
port = 27017 
db_name = 'test_db' 
collection_name = 'test' 

Để kết nối sử dụng MongoClient

# Connect to MongoDB 
client = MongoClient(host=host, port=port) 
# Make a query to the specific DB and Collection 
dbh = client[dbname] 
collection = dbh[collection_name] 

Vì vậy, từ đây câu trả lời thích hợp. Tôi muốn đọc bằng cách sử dụng khối (trong trường hợp này là kích thước 1000).

chunksize = 1000 

Ví dụ chúng tôi có thể quyết định số lượng kích thước (khối lượng) chúng tôi muốn.

# Some variables to create the chunks 
skips_variable = range(0, db_aux[collection].find(query).count(), int(chunksize)) 
if len(skips_variable)<=1: 
    skips_variable = [0,len(skips_variable)] 

Sau đó, chúng tôi có thể truy xuất từng đoạn.

for i in range(1,len(skips_variable)): 

    # Expand the cursor and retrieve data 

    data_from_chunk = dbh[collection_name].find(query)[skips_variable[i-1]:skips_variable[i]])) 

Trường hợp truy vấn trong trường hợp này là query = {}.

Here Tôi sử dụng các ý tưởng tương tự để tạo các khung dữ liệu từ MongoDB. Here Tôi sử dụng một cái gì đó tương tự để viết cho MongoDB theo khối.

Tôi hy vọng điều đó sẽ hữu ích.

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