2012-09-18 5 views
6

Tôi chạy phiên bản Matlab R2011b và R phiên bản 2.13.1 trên Linux Mint v12 với RAM 16 GB.văn bản có thể trong Matlab sử dụng RAM quá mức so với phương pháp tương tự trong R

Tôi có tệp csv. 5 hàng đầu tiên (và tiêu đề) là:

#RIC,Date[G],Time[G],GMT Offset,Type,Price,Volume 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.68,1008 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.66,300 
DAEG.OQ,07-JUL-2011,15:10:03.424,-4,Trade,1.65,1000 
DAEG.OQ,07-JUL-2011,15:10:03.464,-4,Trade,1.65,3180 

Tệp lớn (khoảng 900MB). Với sự kết hợp của nhân vật và dữ liệu số, người ta có thể đọc tập tin này vào matlab như sau:

fid1 = fopen('/home/MyUserName/Temp/X.csv'); 
D = textscan(fid1, '%s%s%s%f%s%f%f', 'Delimiter', ',', 'HeaderLines', 1); 
fclose(fid1); 

Mặc dù tập tin là 900MB, khi chạy đoạn mã trên, System Monitor chỉ ra việc sử dụng RAM của tôi nhảy từ khoảng 2GB đến 10GB . Tồi tệ hơn, nếu tôi thử quy trình tương tự này với tệp csv lớn hơn một chút (khoảng 1,2 GB), RAM của tôi tối đa là 16 GB và Matlab không bao giờ quản lý để đọc xong dữ liệu (chỉ bị kẹt trong chế độ "bận").

Nếu tôi muốn đọc cùng một tập tin vào R, tôi có thể sử dụng:

D <- read.csv("/home/MyUserName/Temp/X.csv", stringsAsFactors=FALSE) 

này có lâu hơn một chút so với Matlab, nhưng màn hình hệ thống chỉ sử dụng RAM của tôi chỉ nhảy từ 2GB lên 3.3GB (nhiều hợp lý hơn cho kích thước tập tin gốc).

Câu hỏi của tôi có hai phần:

1) Tại sao là textscan như một con heo bộ nhớ trong kịch bản này?

2) Có cách tiếp cận nào khác mà tôi có thể sử dụng để nhận tệp 1.2v csv của loại này vào Matlab trên hệ thống của mình mà không cần tối đa RAM không?

CHỈNH SỬA: Chỉ cần làm rõ, tôi tò mò xem liệu có tồn tại giải pháp chỉ có MATLAB hay không, tức là tôi không quan tâm đến giải pháp liên quan đến việc sử dụng ngôn ngữ khác để chia nhỏ tệp csv thành khối (vì đây là những gì tôi đã làm). Xin lỗi Trav1s, tôi nên làm điều này rõ ràng ngay từ đầu.

Trả lời

2

Vấn đề có thể là những chuỗi "% s" này đang được đọc trong các ô dòng Matlab, là cấu trúc dữ liệu không hiệu quả về bộ nhớ cho các chuỗi số lượng thấp. Cellstrs là lousy cho dữ liệu bảng lớn như thế này. Mỗi chuỗi kết thúc lên được lưu trữ trong một mảng nguyên thủy riêng biệt char, mỗi chuỗi có khoảng 400 byte các vấn đề trên không và phân mảnh. Với tệp 900MB của bạn, có vẻ như 18 triệu hàng; 4 chuỗi mỗi hàng, và đó là khoảng 10-20 GB cellstrs để giữ những chuỗi. Ugh.

Điều bạn muốn là chuyển đổi các chuỗi đó thành kiểu dữ liệu nguyên thủy nhỏ gọn khi chúng đến, thay vì nhận được tất cả 18 triệu hàng được ẩn trong chuỗi ô cồng kềnh cùng một lúc. Ngày tháng và dấu thời gian làm biểu đồ dữ liệu hoặc bất kỳ biểu diễn dạng số nào bạn đang sử dụng và các chuỗi có số lượng thấp như 2-d char mảng hoặc một số tương đương với biến phân loại. (Với kích thước tập dữ liệu của bạn, bạn có thể muốn các chuỗi đó được biểu diễn dưới dạng số nhận dạng đơn giản với bảng tra cứu chứ không phải ký tự.)

Khi bạn đã quyết định cấu trúc dữ liệu nhỏ gọn của mình, có một vài phương pháp để nạp nó vào. Bạn chỉ có thể chia phần đọc thành khối trong Matlab tinh khiết: sử dụng số gọi textscan() để đọc trong 1000 dòng tại một thời gian, phân tích cú pháp và chuyển đổi các cellstrs trong đoạn đó thành các hình thức nhỏ gọn của chúng, đệm tất cả các kết quả, và cat chúng lại với nhau ở cuối đọc. Điều đó sẽ giữ cho các yêu cầu bộ nhớ đỉnh thấp hơn.

Nếu bạn định thực hiện nhiều công việc như thế này và vấn đề hiệu suất, bạn có thể muốn thả xuống Java và viết trình phân tích cú pháp của riêng bạn có thể chuyển đổi chuỗi và ngày khi chúng đến. quay lại Matlab như các kiểu dữ liệu nhỏ gọn hơn. Nó không khó, và phương thức Java có thể được gọi trực tiếp từ Matlab, vì vậy điều này chỉ có thể được tính là sử dụng một ngôn ngữ riêng biệt.

+0

Cảm ơn Andrew, đây có vẻ là câu trả lời hay cho câu hỏi, nhưng tôi sẽ không có cơ hội đọc chi tiết cho đến ngày mai (tôi đang làm việc). Xin lỗi về sự chậm trễ. –

+0

Andrew, câu trả lời tốt 1, cảm ơn bạn. –

0

Đối với 2) bạn có thể thử sử dụng lệnh csvread. Tôi không biết làm thế nào hiệu suất so sánh, nhưng ít nhất nó là một thay thế.

Cách khác là đọc tệp bằng ngôn ngữ nhanh hơn nhiều như C hoặc lúng túng, sau đó chia nhỏ thành các tệp nhỏ hơn. Đọc nhiều tập tin nhỏ liên tiếp sẽ ít bộ nhớ tập trung hơn một tệp lớn.

+0

Hi Trav1s, cảm ơn các đề xuất. Thật không may, csvread (hoặc dlmread cho rằng vấn đề) chỉ làm việc với dữ liệu số hoàn toàn. Vì vậy, họ không tốt trong tình huống này (xem dữ liệu mẫu của tôi trong câu hỏi). Về đề xuất thứ hai của bạn, đó thực sự là những gì tôi đang làm vào lúc này, mặc dù tôi đang sử dụng R, chứ không phải C, vì các chức năng nhập dữ liệu cho R không phải là dữ liệu chuyên sâu. –