Vì vậy, tôi có một tệp dữ liệu (được phân tách bằng dấu chấm phẩy) có rất nhiều hàng chi tiết và không đầy đủ (dẫn đến Access và SQL bị nghẹt thở). Đó là tập dữ liệu cấp hạt được chia thành các phân đoạn, phân đoạn con và phân đoạn phụ (với tổng số ~ 200 yếu tố) trong 40 năm. Tóm lại, nó rất lớn, và nó sẽ không vừa với bộ nhớ nếu tôi cố gắng đọc nó một cách đơn giản.
Vì vậy, câu hỏi của tôi là thế này, với điều kiện tôi muốn tất cả các quận, nhưng chỉ một năm duy nhất (và chỉ là mức cao nhất của phân khúc ... cuối cùng dẫn đến khoảng 100.000 hàng), cách tốt nhất để tiếp tục cuộn lên này thành R?
Hiện tại, tôi đang cố gắng loại bỏ những năm không liên quan với Python, vượt qua giới hạn kích thước tệp bằng cách đọc và thao tác trên một dòng tại một thời điểm, nhưng tôi thích giải pháp chỉ R (gói CRAN được). Có cách nào tương tự để đọc từng đoạn trong tệp trong R không?
bất kì ý kiến nào đều được đánh giá cao.
Cập nhật:
- Ràng buộc
- Cần sử dụng máy của tôi , vì vậy không có phiên bản EC2 nào
- Chỉ R càng tốt. Tốc độ và tài nguyên không phải là mối quan tâm trong trường hợp này ... miễn là máy của tôi không phát nổ ...
- Như bạn có thể thấy bên dưới, dữ liệu chứa các loại hỗn hợp, mà tôi cần thao tác sau
- Dữ liệu
- Dữ liệu là 3,5GB, với khoảng 8,5 triệu hàng và 17 cột
- Vài nghìn hàng (~ 2k) không đúng định dạng, chỉ có một cột thay vì 17
- Những thứ này hoàn toàn không quan trọng và có thể bị bỏ
- Tôi chỉ cần ~ 100.000 hàng từ tệp này (Xem bên dưới)
Ví dụ dữ liệu:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
Tôi muốn cắt nhỏ một số cột và chọn hai trong số 40 năm khả dụng (2009-2010 từ 1980-2020), để dữ liệu có thể vừa với R:
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
Các kết quả:
Sau khi tìm hiểu tất cả các đề xuất được đưa ra, tôi quyết định rằng readLines, do JD và Marek đề xuất, sẽ hoạt động tốt nhất. Tôi đưa cho Marek tấm séc vì anh ấy đã đưa ra một bản triển khai mẫu.
Tôi đã sao chép một phiên bản được điều chỉnh một chút của việc triển khai Marek cho câu trả lời cuối cùng của tôi ở đây, sử dụng strsplit và cat để chỉ giữ lại các cột tôi muốn.
Cũng cần phải nhấn mạnh rằng đây là NHIÊU kém hiệu quả hơn so với Python ... như trong, Python chomps thông qua file 3.5GB trong vòng 5 phút trong khi R mất khoảng 60 ... nhưng nếu tất cả các bạn có là R thì đây là vé.
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
Thất bại theo Cách tiếp cận:
- sqldf
- Đây chắc chắn là những gì tôi sẽ sử dụng cho loại vấn đề này trong tương lai nếu dữ liệu được định hình tốt. Tuy nhiên, nếu không, thì SQLite bị nghẹt.
- MapReduce
- Thành thật mà nói, các tài liệu đã đe dọa tôi về điều này một chút, vì vậy tôi đã không cố gắng thử nó. Có vẻ như nó yêu cầu đối tượng cũng phải ở trong bộ nhớ, điều này sẽ đánh bại điểm nếu đúng như vậy.
- bigmemory
- Cách tiếp cận này được liên kết rõ ràng với dữ liệu, nhưng nó chỉ có thể xử lý một loại tại một thời điểm. Kết quả là, tất cả các vectơ ký tự của tôi đều giảm khi được đưa vào big.table. Tuy nhiên, nếu tôi cần thiết kế các tập dữ liệu lớn cho tương lai, tôi chỉ cân nhắc sử dụng các con số để duy trì tùy chọn này.
- quét
- Quét dường như có các vấn đề loại tương tự như bộ nhớ lớn, nhưng với tất cả các cơ chế của readLines. Tóm lại, nó không phù hợp với dự luật lần này.
sed
và / hoặcawk
tạo một phiên bản CSV cắt nhỏ mà bạn có thể đọc trực tiếp. Vì đây là một cách giải quyết hơn là một câu trả lời, tôi sẽ để nó dưới dạng một nhận xét.