2011-08-08 36 views
6

Tôi có một số tệp lớn, lớn mà tôi làm việc cùng và tôi sử dụng một số hàm I/O khác nhau để truy cập chúng. Phổ biến nhất là gói bigmemory.Kiểm tra xem bộ đệm đã được xả trong R

Khi ghi vào tệp, tôi đã học được cách khó để xóa bộ đệm đầu ra, nếu không tất cả các phiên cược sẽ được tắt cho dù dữ liệu đã được lưu chưa. Tuy nhiên, điều này có thể dẫn đến một số thời gian chờ đợi rất dài trong khi bigmemory làm điều của nó (nhiều phút). Tôi không biết tại sao điều này xảy ra - nó không phải lúc nào cũng xảy ra và nó không dễ tái tạo.

Có cách nào để xác định xem bộ đệm I/O đã được xả trong R, đặc biệt là đối với bigmemory? Nếu hệ điều hành quan trọng, thì hãy tự do hạn chế câu trả lời theo cách đó.

Nếu câu trả lời có thể được khái quát hóa ngoài bigmemory, điều đó sẽ tuyệt vời, vì đôi khi tôi dựa vào các chức năng ánh xạ bộ nhớ khác hoặc luồng I/O.

Nếu không có giải pháp tốt để kiểm tra xem bộ đệm đã được xả, có trường hợp nào trong đó có thể giả định rằng bộ đệm đã bị xóa? I E. ngoài việc sử dụng flush().

Cập nhật: Tôi nên làm rõ rằng đây là tất cả các kết nối nhị phân. @RichieCotton lưu ý rằng isIncomplete(), mặc dù tài liệu trợ giúp chỉ đề cập đến các kết nối văn bản. Nó không rõ ràng nếu đó là có thể sử dụng cho các kết nối nhị phân.

+0

Không chắc chắn về việc sử dụng với 'bigmemory', nhưng' isIncomplete' hoạt động cho các kết nối thông thường. –

+0

Cảm ơn! Thông tin trợ giúp rất hạn chế về kết nối chỉ đề cập đến isIncomplete phù hợp cho đầu ra của các kết nối văn bản. Bạn đã có may mắn với các kết nối nhị phân chưa? – Iterator

Trả lời

0

tôi sẽ đưa ra câu trả lời của riêng tôi, nhưng tôi hoan nghênh bất cứ điều gì đó là rõ ràng hơn.

Từ những gì tôi đã thấy cho đến nay, các chức năng kết nối khác nhau, ví dụ: file, open, close, flush, isOpenisIncomplete (trong số những người khác), được dựa trên các loại kết nối cụ thể, ví dụ: tệp, đường ống, URL và một vài thứ khác.

Ngược lại, bigmemory có kiểu kết nối riêng và đối tượng bigmemory là đối tượng S4 có khe cắm cho địa chỉ bộ nhớ cho bộ đệm hệ điều hành. Khi được đặt ở đó, hệ điều hành có nhiệm vụ xả các bộ đệm đó. Vì đó là trách nhiệm của hệ điều hành nên việc nhận thông tin về bộ đệm "bẩn" cần tương tác với hệ điều hành, không phải với R.

Do đó, câu trả lời cho bigmemory là "không" khi dữ liệu được lưu trữ trong bộ đệm hạt nhân. có thể là "có" đối với các kết nối khác được xử lý thông qua STDIO (tức là được lưu trữ trong "không gian người dùng").

Để biết thêm thông tin chi tiết về khía cạnh hệ điều hành/hạt nhân, hãy xem this question on SO; Tôi đang điều tra một vài chương trình (không chỉ là R + bigmemory) đang tạo ra sự tò mò về bộ đệm, và chuỗi đó đã giúp tôi khai sáng về khía cạnh hạt nhân của mọi thứ.

0

Điều này có thuyết phục hơn rằng isIncomplete() hoạt động với các tệp nhị phân không?

# R process 1 
zz <- file("~/test", "wb") 
writeBin(c(1:100000),con=zz) 
close(zz) 

# R process 2 
zz2 <- file("~/test", "rb") 
inpp <- readBin(con=zz2, integer(), 10000) 
while(isIncomplete(con2)) {Sys.sleep(1); inpp <- c(inpp, readBin(zz2),integer(), 10000)} 
close(zz2) 

(Modified từ sự giúp đỡ (kết nối) tập tin.)

+0

Cảm ơn bạn đã thử nghiệm điều này. Tuy nhiên, trừ khi tôi hiểu sai, ví dụ của bạn chỉ sử dụng nó trong trường hợp bộ đệm đầu vào.Tôi không thực sự rõ ràng rằng nó hoạt động trên bộ đệm đầu ra. Tôi không quen thuộc với bộ đệm đầu ra để xác định xem chúng tôi có thể kiểm tra nó theo cùng một cách hay không. Tôi chỉ miễn cưỡng vượt ra ngoài tài liệu - nếu hành vi của nó là ngẫu nhiên, thay vì xác định, thì tôi có nguy cơ một loạt dữ liệu bị hỏng. Tôi đã xuống con đường đó, vì vậy tôi thận trọng. :) – Iterator

+0

Sau khi thử nghiệm thêm, tôi không nghĩ 'isIncomplete()' hoạt động cho các đối tượng 'bigmemory': Có vẻ như các đối tượng là con trỏ của một số loại, thay vì kết nối. :( – Iterator

+0

Cảm ơn gợi ý và ví dụ. Hóa ra trong trường hợp này các bộ đệm được xử lý bên ngoài R. – Iterator

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