2010-02-10 44 views
7

Đối với mã Python sau:Chức năng "mở" của Python có lưu nội dung của nó vào bộ nhớ hoặc trong một tệp tạm thời không?

fp = open('output.txt', 'wb') 
# Very big file, writes a lot of lines, n is a very large number 
for i in range(1, n): 
    fp.write('something' * n) 
fp.close() 

Quá trình viết trên có thể kéo dài hơn 30 phút. Đôi khi tôi gặp lỗi MemoryError. Là nội dung của tập tin trước khi đóng được lưu trữ trong bộ nhớ hoặc được viết trong một tập tin tạm thời? Nếu nó nằm trong một tệp tạm thời, vị trí chung của nó trên một hệ điều hành Linux là gì?

Edit:

Added fp.write trong một vòng lặp for

+0

Bạn có thực sự phát hành nhiều cuộc gọi đến 'fp.write' hoặc thu thập tất cả trong một chuỗi lớn và viết ra cùng một lúc không? Sau này sẽ là không hiệu quả. –

+0

Nó gọi nhiều ghi trong vòng lặp for. –

+0

hiển thị mã. nếu bạn viết một dòng một dòng, nó không phải là một vấn đề. – ghostdog74

Trả lời

5

Nó được lưu trữ trong bộ nhớ cache đĩa của hệ điều hành trong bộ nhớ cho đến khi nó là đỏ ửng vào đĩa, hoặc ngầm do các vấn đề thời gian hay không gian, hoặc rõ ràng qua fp.flush().

+2

Sau khi câu hỏi đã được sửa đổi, bây giờ rõ ràng rằng ''một cái gì đó' * n' sẽ gây ra vấn đề bộ nhớ nghiêm trọng khi' n' được lớn. Tập tin văn bản không có gì để làm với ''một cái gì đó' * n' mệt mỏi bộ nhớ. –

3

Sẽ có ghi đệm trong hạt nhân Linux, nhưng tại (ir) khoảng thời gian đều đặn chúng sẽ được chuyển sang đĩa. Việc chạy ra khỏi vùng đệm như vậy sẽ không bao giờ gây ra lỗi bộ nhớ mức ứng dụng; các bộ đệm sẽ trống trước khi điều đó xảy ra, tạm dừng ứng dụng trong khi làm như vậy.

1

Nếu bạn viết ra một tệp lớn mà việc ghi có thể thất bại, bạn nên tự xóa tệp một cách chính xác hơn bằng cách sử dụng fp.flush(). Bằng cách này, các tập tin sẽ được ở một vị trí lựa chọn của bạn mà bạn có thể dễ dàng đến được chứ không phải là ở lòng thương xót của hệ điều hành:

fp = open('output.txt', 'wb') 
counter = 0 
for line in many_lines: 
    file.write(line) 
    counter += 1 
    if counter > 999: 
     fp.flush() 
fp.close() 

này sẽ xóa sạch các tập tin vào đĩa mỗi 1000 dòng.

0

Nếu bạn viết từng dòng, nó không phải là một vấn đề. Bạn nên hiển thị mã của những gì bạn đang làm trước khi viết. Để bắt đầu, bạn có thể thử xóa các đối tượng không cần thiết, sử dụng fp.flush() vv ..

0

Viết văn bản không bao giờ nên đưa ra lỗi bộ nhớ; với tất cả khả năng, bạn có một số lỗi ở một nơi khác.

Nếu bạn có vòng lặp và lỗi bộ nhớ, thì tôi sẽ xem liệu bạn có đang bị "rò rỉ" tham chiếu đến các đối tượng hay không.
Cái gì như:

def do_something(a, b = []): 
    b.append(a) 
    return b 

fp = open('output.txt', 'wb') 

for i in range(1, n): 
    something = do_something(i) 
    fp.write(something) 

fp.close() 

Tôi bây giờ chọn chỉ là một ví dụ, nhưng trong trường hợp thực tế của bạn rò rỉ tài liệu tham khảo có thể nhiều khó khăn hơn để tìm thấy; tuy nhiên trường hợp này sẽ chỉ rò rỉ bộ nhớ bên trong do_something vì cách Python xử lý các tham số mặc định của các hàm.

2

Xây dựng bình luận của ataylor cho câu hỏi:

Bạn có thể muốn lồng vòng của mình. Một cái gì đó như

for i in range(1,n): 
    for each in range n: 
     fp.write('something') 
fp.close() 

Bằng cách đó, điều duy nhất mà được đưa vào bộ nhớ là chuỗi "something", không "something" * n.

+0

+1: Tạo '" một cái gì đó "* n' cho các giá trị lớn của' n' sẽ làm cạn kiệt bộ nhớ. Ghi vào một tập tin sử dụng rất ít bộ nhớ. –

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