2012-07-01 38 views
18
Traceback (most recent call last): 
File "/run-1341144766-1067082874/solution.py", line 27, in 
main() 
File "/run-1341144766-1067082874/solution.py", line 11, in main 
if len(s[i:j+1]) > 0: 
MemoryError 
Error in sys.excepthook: 
Traceback (most recent call last): 
File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 64, in apport_excepthook 
from apport.fileutils import likely_packaged, get_recent_crashes 
File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in 
from apport.report import Report 
MemoryError 

Original exception was: 
Traceback (most recent call last): 
File "/run-1341144766-1067082874/solution.py", line 27, in 
main() 
File "/run-1341144766-1067082874/solution.py", line 11, in main 
if len(s[i:j+1]) > 0: 
MemoryError 

Lỗi trên xuất hiện khi tôi cố chạy chương trình sau. Ai đó có thể giải thích lỗi bộ nhớ là gì và cách khắc phục vấn đề này? . Chương trình lấy chuỗi làm đầu vào và tìm tất cả các chuỗi con có thể và tạo một tập hợp (theo thứ tự từ điển) và nó sẽ in giá trị tại chỉ mục tương ứng mà người dùng yêu cầu, nếu không nó sẽ in 'Invalid'lỗi bộ nhớ trong python

def main(): 
    no_str = int(raw_input()) 
    sub_strings= [] 
    for k in xrange(0,no_str): 
     s = raw_input() 
     a=len(s) 
     for i in xrange(0, a): 
      for j in xrange(0, a): 
       if j >= i: 
        if len(s[i:j+1]) > 0: 
         sub_strings.append(s[i:j+1]) 
    sub_strings = list(set(sub_strings)) 
    sub_strings.sort() 
    queries= int(raw_input()) 
    resul = [] 
    for i in xrange(0,queries): 
     resul.append(int(raw_input())) 
    for p in resul: 
     try: 
      print sub_strings[p-1] 
     except IndexError: 
      print 'INVALID' 


if __name__ == "__main__": 
    main() 
+5

Bạn đang ra khỏi bộ nhớ: http://docs.python.org/library/exceptions.html – usoban

+1

Tôi nghĩ rằng bạn có thể hết bộ nhớ, bạn có thể đăng dữ liệu đầu vào của mình không? –

+0

Bạn đang cố gắng làm gì? – robert

Trả lời

12

này ai ở đây:

s = raw_input() 
a=len(s) 
for i in xrange(0, a): 
    for j in xrange(0, a): 
     if j >= i: 
      if len(s[i:j+1]) > 0: 
       sub_strings.append(s[i:j+1]) 

có vẻ là rất không hiệu quả và tốn kém cho các chuỗi lớn.

Better làm

for i in xrange(0, a): 
    for j in xrange(i, a): # ensures that j >= i, no test required 
     part = buffer(s, i, j+1-i) # don't duplicate data 
     if len(part) > 0: 
      sub_Strings.append(part) 

Một đối tượng đệm giữ một tham chiếu đến chuỗi ban đầu và bắt đầu và các thuộc tính chiều dài. Bằng cách này, không cần sao chép dữ liệu không cần thiết.

Chuỗi dài ll*l/2 chuỗi con có độ dài trung bình l/2, vì vậy mức tiêu thụ bộ nhớ gần như là l*l*l/4. Với một bộ đệm, nó nhỏ hơn nhiều.

Lưu ý rằng buffer() chỉ tồn tại trong 2.x. 3.x có memoryview(), được sử dụng hơi khác.

Thậm chí tốt hơn là tính toán các chỉ mục và cắt chuỗi con theo yêu cầu.

5

A memory error có nghĩa là chương trình của bạn đã hết bộ nhớ. Điều này có nghĩa là chương trình của bạn bằng cách nào đó tạo ra quá nhiều đối tượng.

Trong ví dụ của bạn, bạn phải tìm các phần của thuật toán có thể tiêu tốn rất nhiều bộ nhớ. Tôi nghi ngờ rằng chương trình của bạn được đưa ra chuỗi rất dài như đầu vào. Do đó, s[i:j+1] có thể là thủ phạm, vì nó tạo ra một danh sách mới. Lần đầu tiên bạn sử dụng nó, nó không cần thiết vì bạn không sử dụng danh sách được tạo ra. Bạn có thể thử để xem những điều sau đây sẽ giúp:

if j + 1 < a: 
    sub_strings.append(s[i:j+1]) 

Để thay thế việc tạo danh sách thứ hai, bạn chắc chắn nên sử dụng một đối tượng buffer, theo đề nghị của glglgl.

Cũng lưu ý rằng kể từ khi bạn sử dụng if j >= i:, bạn không cần phải bắt đầu của bạn xrange tại 0. Bạn có thể có:

for i in xrange(0, a): 
    for j in xrange(i, a): 
     # No need for if j >= i 

Một thay thế triệt để hơn sẽ là để cố gắng làm lại thuật toán của bạn để bạn có không tính toán trước tất cả các chuỗi con có thể. Thay vào đó, bạn có thể chỉ cần tính toán chuỗi con được hỏi.

+1

Tôi đã biết rằng, một chút giải thích thêm về lý do tại sao điều này xảy ra trong trường hợp này sẽ hữu ích hơn . –

+2

Tôi chỉ đơn giản là cố gắng cung cấp một câu trả lời rõ ràng cho tiêu đề của câu hỏi của bạn, trong trường hợp ai đó tìm thấy nó tìm kiếm 'MemoryError' và Python. – Rodrigue

+0

@kratos Bạn đã yêu cầu: "Ai đó có thể giải thích lỗi bộ nhớ là gì", – glglgl

0

bạn có thể thử tạo cùng một tập lệnh mà cửa sổ bật lên có lỗi, chia tập lệnh thành nhiều tập lệnh bằng cách nhập từ tập lệnh bên ngoài. Ví dụ, hello.py mong đợi lỗi Lỗi bộ nhớ, vì vậy tôi chia hello.py thành nhiều tập lệnh h.py e.py ll.py o.py tất cả chúng phải vào thư mục "hellohello" vào thư mục đó tạo init.py vào init write import h, e, ll, o và sau đó trên ide bạn viết import hellohello

1

Sử dụng python 64 bit giải quyết rất nhiều vấn đề.

+5

Có lẽ nó hữu ích cho những người dùng khác để giải thích tại sao nó giải quyết vấn đề? – DeadChex

7

Nếu bạn nhận được số MemoryError không mong muốn và bạn cho rằng mình nên có nhiều RAM, có thể là do bạn đang sử dụng cài đặt python 32 bit.

Giải pháp dễ dàng, nếu bạn có hệ điều hành 64 bit, hãy chuyển sang cài đặt python 64 bit.

Vấn đề là python 32 bit chỉ có quyền truy cập vào ~ 4GB RAM. Điều này có thể thu nhỏ hơn nữa nếu hệ điều hành của bạn là 32-bit, vì chi phí của hệ điều hành.

Bạn có thể tìm hiểu thêm về lý do tại sao các hệ điều hành 32-bit được giới hạn ~ 4GB RAM ở đây: https://superuser.com/questions/372881/is-there-a-technical-reason-why-32-bit-windows-is-limited-to-4gb-of-ram

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