5
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đang cố gắng tính toán sự khác biệt giữa hai tệp CSV lớn (~ 4GB) để có được các hàng mới được thêm vào và ghi chúng vào tệp CSV đầu ra. Tôi có thể có được chức năng này cho các tệp tương đối nhỏ (~ 50MB) bằng cách sử dụng mã sau.
input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" with open(input_file1, 'r') as t1, open(input_file2, 'r') as t2: fileone = t1.readlines() filetwo = t2.readlines() with open(output_path, 'w') as outFile: for line in filetwo: if line not in fileone: outFile.write(line)Tuy nhiên, đối với các tệp lớn hơn, mã trên là quá chậm (chạy trong khoảng nửa giờ) hoặc gặp sự cố vì thiếu không gian bộ nhớ.
Có cách nào nhanh hơn để có được sự khác biệt cho các tệp CSV lớn không?
Hỏi ngày 30 tháng 4 năm 2018 lúc 19:43Apr 30, 2018 at 19:43
iprof0214iprof0214iprof0214
6612 Huy hiệu vàng6 Huy hiệu bạc19 Huy hiệu đồng2 gold badges6 silver badges19 bronze badges
5
Bạn không phải đọc hoàn toàn tệp thứ hai, chỉ cần đọc từng dòng.
Và với tốc độ, chỉ cần tạo một set trong tệp đầu tiên (tra cứu nhanh và lưu bộ nhớ nếu có các dòng trùng lặp). Đối với điều này, bạn phải mở tệp thứ hai khi bạn viết kết quả:
input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" with open(input_file1, 'r') as t1: fileone = set(t1) with open(input_file2, 'r') as t2, open(output_path, 'w') as outFile: for line in t2: if line not in fileone: outFile.write(line)- for line in t2 đọc từng dòng tệp (luôn luôn tránh readlines() nếu bạn có thể) vì vậy ngay cả khi tệp lớn, dấu chân bộ nhớ nhỏ.
- fileone có một số bộ nhớ, đúng, nhưng hy vọng nếu nó nhỏ hơn và/hoặc có các dòng trùng lặp, không quá nhiều, và tất nhiên là ít hơn với readlines()
- if line not in fileone có thể trông giống như trước đây, nhưng nó có độ phức tạp trung bình ____10, giúp chương trình nhanh hơn nhiều
Đã trả lời ngày 30 tháng 4 năm 2018 lúc 19:49Apr 30, 2018 at 19:49
0
Bạn có thể sử dụng cơ sở dữ liệu hoặc thay vào đó là một sự hợp nhất sắp xếp. Tôi sẽ cung cấp cho bạn thuật toán cơ bản (chứ không phải mã Python)Sort Merge. I will give you the basic algorithm (rather than python Code)
Sắp xếp mô tả hợp nhất
Ý tưởng là sắp xếp 2 tệp theo thứ tự tương tự. Sau đó đọc tuần tự qua 2 tệp
- Nếu các bản ghi trong 2 tệp bằng nhau -> trong cả hai tệp
- Nếu bản ghi tệp cũ> hồ sơ mới-> bản ghi đã được chèninserted
- if old-file-record < new-file-record --> record has been deleted
Sắp xếp thuật toán hợp nhất
Sort the 2 files to new SortedFiles using the Operating Systems sort (use the whole record as sort key) Open/Read SortedOldFile Open/Read SortedNewFile while (not end-of-file-SortedOldFile) and (not end-of-file-SortedOldFile): if SortedOldFile.record < SortedNewFile.record: ## Deleted processing goes here read SortedOldFile elseif SortedOldFile.record > SortedNewFile.record: ## Insert processing goes here read SortedNewFile else read SortedOldFile read SortedNewFile while (not end-of-file-SortedOldFile): ## Deleted processing read SortedOldFile while (not end-of-file-SortedNewFile): ## Insert processing read SortedNewFileAdvantages:
- Sử dụng bộ nhớ tối thiểu
- Nó chia tỷ lệ thành các tệp hoàn toàn lớn
- Phải đủ nhanh, các loại hệ điều hành rất hiệu quả
Disadvantages:
- Sử dụng không gian đĩa bổ sung (không gian đĩa ngày nay rẻ tiền)
- Mã phụ thuộc vào hệ điều hành
Đã trả lời ngày 1 tháng 5 năm 2018 lúc 0:19May 1, 2018 at 0:19
Bruce Martinbruce MartinBruce Martin
10,3K1 Huy hiệu vàng26 Huy hiệu bạc37 Huy hiệu đồng1 gold badge26 silver badges37 bronze badges
Bạn có thể băm dòng để nén bộ nhỏ hơn, sau đó so sánh. hoặc sử dụng thuật toán nâng cao hơn để tìm dấu vân tay
or using more advanced algorithm to find finger print
//en.wikipedia.org/wiki/Fingerprint_(computing)
import hashlib input_file1 = "data.csv" input_file2 = "data_1.csv" output_path = "out.csv" def get_data(file_): res = {} m = hashlib.md5() for i, line in file_: hashed_line = m.update(line).hexdigest() if hashed_line not in res: res[hashed_line ] = [] res[hashed_line ].append(i) with open(input_file1, 'r') as t1, open(input_file2, 'r') as t2: file1_data = get_data(t1) file2_data = get_data(t2) file2_raw = t2.readlines() with open(output_path, 'w') as outFile: for line in file2_data: if line not in file1_data: outFile.write(file2_raw[file2_data[line]])Đã trả lời ngày 30 tháng 4 năm 2018 lúc 19:53Apr 30, 2018 at 19:53
Galaxyangalaxyangalaxyan
5.7082 Huy hiệu vàng18 Huy hiệu bạc41 Huy hiệu đồng2 gold badges18 silver badges41 bronze badges
7