2009-09-17 36 views
22

Tôi cần trả về một tệp khá lớn (11MB) cho người dùng. Vì một số lý do nhất định, tôi không thể chỉ cung cấp url trực tiếp cho tệp (http://www.sample.com/mybigfile.exe); thay vào đó, nó phải được truy cập thông qua mã.Kích thước tối đa của đối tượng có thể được lưu trong memcached với memcache.py

Thay vì phải đọc nó từ đĩa hơn và hơn, tôi nghĩ về việc lưu nó trong memcached (nếu điều này không phải là một ý tưởng tốt, cho tôi biết). Tất cả mọi thứ dường như làm việc, tốt (không có lỗi), nhưng khi tôi cố gắng để lấy các tập tin từ memcached tôi luôn luôn nhận được Không, như thể các tập tin không được lưu trữ.

Có giới hạn kích thước cho những gì có thể được lưu không?

Dưới đây là các mã:

def download_demo(): 
    """ 
    Returns the demo file 
    """ 
    KEY = "xyz" 
    TIME = 86400 #24 hours 

    buff = memc.get(KEY) 
    if not buff: 
     file = open(FILENAME, 'r') 
     buff = file.read() 
     memc.set(KEY, buff, TIME) 

    print "Content-Type:application/x-download\nContent-Disposition:attachment;filename=%s\nContent-Length:%s\n\n%s" % (os.path.split(FILENAME)[-1], len(buff), buff) 
+0

Nếu memcache đang chạy cục bộ, có thể bạn sẽ không thực sự giành được nhiều thứ bằng cách đọc nội dung từ đó, vì giả sử có đủ RAM, hệ thống tệp sẽ có bộ nhớ đệm trong RAM. – radiospiel

Trả lời

31

Có hai mục về điều đó trong memcached FAQ:

Câu trả lời cho một trong những đầu tiên là (trích dẫn, tôi nhấn mạnh):

Kích thước tối đa của một giá trị bạn có thể lưu trữ trong memcached là 1 megabyte. Nếu dữ liệu của bạn lớn hơn, hãy xem xét nén hoặc chia tách giá trị thành nhiều khóa.

Vì vậy, tôi đoán tệp 11MB của bạn quá lớn để vừa với một mục nhập ghi nhớ.

Tăng kích thước của một đối tượng là có thể, theo các câu trả lời khác.

+4

Lưu ý: Memcached bây giờ cho phép bạn thay đổi giới hạn kích thước khi khởi chạy – NoviceCoding

+18

Các liên kết này đều đã chết ngay bây giờ –

+3

Trong phiên bản mới hơn của Memcached bạn có thể đặt giới hạn tối đa 128 mb bằng tùy chọn -I (linux.die.net/man/1/memcached). Bạn có thể xem xét chuyển sang Redis để lưu trữ đối tượng lớn. – maxwell2022

1

Kích thước dữ liệu tối đa là 1mb mỗi món

http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_%281_megabyte%29

Cập nhật: Đây là một câu trả lời 2009. Và trong ngày đó, thông tin đã chính xác và nguồn chính thức. Bây giờ trong năm 2014 memcached có thể lưu trữ 128mb thay vì 1mb (nhưng các nhà phát triển đã không bận tâm để cập nhật các câu hỏi thường gặp chính thức). Tham chiếu duy nhất mà ai đó có thể tìm thấy id là trang tối nghĩa có thể sẽ chết trong một năm.

+1

Đây là liên kết đã chết ngay bây giờ – maxwell2022

+0

Tôi không thể tìm thấy bất kỳ nguồn mới nào ở đó. Có vẻ như đó là quảng cáo xấu? –

+0

Trong các phiên bản memcached mới hơn, bạn có thể đặt giới hạn là 128 mb bằng cách sử dụng tùy chọn '-I' (http://linux.die.net/man/1/memcached). Cá nhân tôi chuyển sang Redis để lưu trữ đối tượng lớn. – maxwell2022

30

Tính đến memcache 1.4.2, đây là một tham số do người dùng cấu hình:

http://code.google.com/p/memcached/wiki/ReleaseNotes142

cấu hình kích thước tối đa mục

Nhiều người đã hỏi cho memcached để có thể lưu trữ các mặt hàng lớn hơn hơn 1MB, trong khi thường được khuyến nghị rằng người ta không làm điều này, bây giờ là được hỗ trợ trên dòng lệnh.

Một số ít người khai ngộ cũng đã được yêu cầu ghi nhớ để giảm kích thước tối đa mục. Đó cũng là một lựa chọn.

Thông số -I mới cho phép bạn chỉ định kích thước mục tối đa tại thời gian chạy là .Nó hỗ trợ một postfix đơn vị để cho phép biểu hiện tự nhiên của kích thước mục.

Ví dụ:

memcached -I 128k # Mục từ chối lớn hơn 128k.

memcached -Tôi 10m # Cho phép đối tượng lên đến 10MB

+0

Giống như trong câu trả lời khác, các liên kết này cũng đã chết ngay bây giờ – e4c5

21

Để tóm tắt các bước cần thiết:

1) Cập nhật Memcache lên phiên bản 1.4.2 hoặc mới hơn.

2) Thêm cờ -I 15M (hoặc nhiều megabyte) vào lệnh chạy memcache của bạn.

Đó là một trong hai dòng lệnh, hoặc trong Ubuntu, thêm dòng

-I 15M 

đến bất cứ nơi nào trong /etc/memcached.conf và khởi động lại dịch vụ.

3) Thêm cờ cần thiết cho ứng dụng khách trong memcache.

import memcache 
memc = memcache.Client(['localhost'], server_max_value_length=1024*1024*15) 
memc.set(KEY, buff, TIME) 

Nếu bạn không có quyền truy cập trực tiếp vào ứng dụng khách memcache (tức là làm việc qua khuôn khổ), thì chỉ cần hack mã memcache trực tiếp.

Trên Ubuntu, nó là /usr/local/lib/python2.7/dist-packages/memcache.py. Thay đổi dòng:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024

để

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

Rõ ràng, bạn sẽ cần phải làm này hack nhiều lần nếu bạn cập nhật memcache, nhưng đó là một sửa chữa rất đơn giản và nhanh chóng.

+0

Đối số bạn muốn chuyển đến python memcache Client thực sự là server_max_value_length xem [memcache.py:163](https://github.com/linsomniac/python-memcached /blob/master/memcache.py#L163) –

+0

Cảm ơn, tôi đã cập nhật ví dụ. – Alex

1

Bài viết sau giải thích lý do tại sao nó giới hạn kích thước tối đa của một tệp thành 1M.

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

Về cơ bản, có những mảnh nhỏ của các trang bộ nhớ trong memcache, bên trong đó đối tượng cư trú.

Và kích thước trang mặc định có vẻ là 1M, do đó, đối tượng tối đa mà trang có thể chứa được giới hạn trong 1 triệu.

Mặc dù bạn có thể định cấu hình để tăng kích thước nhưng tôi nghĩ rằng điều này có thể có một số loại giao dịch hiệu suất.

0

Nếu bạn đang sử dụng ứng dụng khách python memcached, vui lòng đảm bảo tăng giới hạn trong tệp memcache.py của máy khách cùng với máy chủ ghi nhớ.

~/anaconda/lib/python2.7/site-packages/memcache.py

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15 

bạn có thể nhìn thấy trong giao diện điều khiển memcached (telnet localhost 11211)

stats tấm STAT 48: chunk_size 3677344

0

Không ai dường như để giải quyết một phần của câu hỏi:

Thay vì phải đọc nó từ đĩa nhiều lần, tôi nghĩ tiết kiệm nó trong memcached (nếu điều này không phải là một ý tưởng tốt, cho tôi biết).

Đây không phải là ý hay. Tất cả các hệ thống tệp hiện đại đều có cơ chế lưu bộ nhớ đệm hiệu quả. Đọc một tập tin từ đĩa đã được đọc một vài giây trước đó thường sẽ vẫn còn trong bộ nhớ cache. Điều này là nhanh hơn nhiều so với truy cập memcached qua mạng.

Nếu bạn đang chạy memcached trên 127.0.0.1, bộ nhớ mà nó đã xác nhận sẽ chỉ được sử dụng cho tệp đơn đó, nếu bạn chỉ đơn giản dựa vào bộ nhớ đệm của hệ điều hành, bộ nhớ có thể được sử dụng cho các mục đích khác nhau tùy thuộc vào công việc trong tầm tay.

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