Mấy đoạn code trên em đều thêm Microsoft ActiveX Data Objects
Mã:
Sub test123()
Dim ObjStream As Object
Dim strTmp As String
Dim path As String
path = "C:\Users\toan_pham\Desktop\test\1\PEC_20210518.log"
Set ObjStream = CreateObject("ADODB.stream")
With ObjStream
.Type = 2
.Charset = "EUC-JP"
.Open
.LoadFromFile path
Debug.Print "bat dau doc"
strTmp = .ReadText(-1)
Debug.Print "doc xong"
.Close
End With
Set ObjStream = Nothing
ThisWorkbook.Worksheets(3).Cells(1, 1) = left(strTmp, 23)
End Sub
Nay em có thử lại với đoạn code này:
File em đang thử test có dung lượng tầm 85MB. Bình thường em dùng code bài #1 sẽ mất tầm 2 phút, nhưng với code ở bài này em đợi hơn 3 phút không thấy phản hồi nên ép tắt chương trình và thấy báo lỗi sau:
Em đang xem cách đọc toàn bộ tập tin thì mất bao nhiêu thời gian, nếu ngắn hơn cách bài #1 thì em mới dùng.
Mục tiêu của em bây giờ là tìm xem có cách nào rút ngắn đựoc thời gian chạy chuơng trình hay không? Anh có ý tưởng nào có thể gợi ý cho em không ạ!
nói chung nếu xử lý tuần tự thì máy tính trâu bò mấy cũng đua ko lại với 100M dữ liệu trong 1 giây đâu !@@
mình phải thiết kế sao đó cho nó xử lý song song ấy ,
ví dụ có 10 chương trình chạy song song , chia nhau mỗi cái xử lý 10M chẳng hạn !
Em đang xem cách đọc toàn bộ tập tin thì mất bao nhiêu thời gian, nếu ngắn hơn cách bài #1 thì em mới dùng.
Mục tiêu của em bây giờ là tìm xem có cách nào rút ngắn đựoc thời gian chạy chuơng trình hay không? Anh có ý tưởng nào có thể gợi ý cho em không ạ!
Tối ưu thì người ta tối ưu cả chương trình, chứ đâu làm mỗi khúc nào đó.
Tất nhiên mọi khúc đều ngon thì cả chương trình đều ngon, nhưng đâu phải lúc nào cũng như mơ được vậy.
Ví dụ chương trình của bạn có 2 phần: Đọc dữ liệu từ tập tin, xử lý lấy dữ liệu.
Với cách đọc từng dòng giả sử hết t11=4 (thời gian), xử lý t12 = 6 (thời gian)
Với cách đọc cả tập tin một lúc giả sử hết t21 = 6 (thời gian), phần xử lý (dựa trên phần 1) t22 = 3 (thời gian).
Đó, rắc rối vậy á.
nói chung nếu xử lý tuần tự thì máy tính trâu bò mấy cũng đua ko lại với 100M dữ liệu trong 1 giây đâu !@@
mình phải thiết kế sao đó cho nó xử lý song song ấy ,
ví dụ có 10 chương trình chạy song song , chia nhau mỗi cái xử lý 10M chẳng hạn !
Có thể, vì chưa biết người hỏi chạy code gì tìm cái gì, nên đó chỉ là 1 giải pháp tham khảo
@người hỏi: Cần rõ là tìm gì, và kiểm soát gì, cấu trúc file đó là gì?
nói chung nếu xử lý tuần tự thì máy tính trâu bò mấy cũng đua ko lại với 100M dữ liệu trong 1 giây đâu !@@
mình phải thiết kế sao đó cho nó xử lý song song ấy ,
ví dụ có 10 chương trình chạy song song , chia nhau mỗi cái xử lý 10M chẳng hạn !
Tối ưu thì người ta tối ưu cả chương trình, chứ đâu làm mỗi khúc nào đó.
Tất nhiên mọi khúc đều ngon thì cả chương trình đều ngon, nhưng đâu phải lúc nào cũng như mơ được vậy.
Ví dụ chương trình của bạn có 2 phần: Đọc dữ liệu từ tập tin, xử lý lấy dữ liệu.
Với cách đọc từng dòng giả sử hết t11=4 (thời gian), xử lý t12 = 6 (thời gian)
Với cách đọc cả tập tin một lúc giả sử hết t21 = 6 (thời gian), phần xử lý (dựa trên phần 1) t22 = 3 (thời gian).
Đó, rắc rối vậy á.
cách dễ dàng nhất là đầu tư mạnh về công nghệ , như lúc đầu bạn có thông tin là xử lý 100M hết 2 phút !
nếu mình có 2 máy tính , mỗi máy xử lý nửa file , thì thời gian sẽ giảm 1 nửa !
Function readTextFile(ByVal strFile As String) As String
Dim FSo As Object, txtFile As Object
Set FSo = CreateObject("Scripting.FileSystemObject")
Set txtFile = FSo.OpenTextFile(strFile, 1, 0, -2)
readTextFile = txtFile.ReadAll
txtFile.Close
Set FSo = Nothing
Set txtFile = Nothing
End Function
Máy của bạn dùng SSD? máy tôi dùng SATA đọc chậm hơn nhiều.
Nhưng bản thân tôi thì stream cả file hay từng dòng tùy theo nhu cầu chứ chả theo tốc độ.
Ví dụ nếu chỉ cần tìm vài chuõi trong file thì stream cả file, nếu cần phân biệt dòng thì stream từng dòng.
Thì từ đầu toi đã nói đây là điển hình việc "đổ thừa sếp ngu" mờ.
Ba cái mớ parse text files này ai lại đi dùng đồ dỏm VBA. Còn đòi tăng tốc mới nực cười.
Máy của bạn dùng SSD? máy tôi dùng SATA đọc chậm hơn nhiều.
Nhưng bản thân tôi thì stream cả file hay từng dòng tùy theo nhu cầu chứ chả theo tốc độ.
Ví dụ nếu chỉ cần tìm vài chuõi trong file thì stream cả file, nếu cần phân biệt dòng thì stream từng dòng.
- Em xin nhờ các anh chị giúp đỡ lấy dữ liệu file excel đang đóng sang file excel đang mở bằng VBA xử dụng ADODB (ADO) - Em có ngồi kiếm code đễ sửa chữa nhưng đa số code mở lên 1 bảng chọn file, hoặc copy địa chỉ cố định. Hai vấn đề này khiến em không thể sửa code trên mạng để dùng được - Vì: +...
Function readTextFile(ByVal strFile As String) As String
Dim FSo As Object, txtFile As Object
Set FSo = CreateObject("Scripting.FileSystemObject")
Set txtFile = FSo.OpenTextFile(strFile, 1, 0, -2)
readTextFile = txtFile.ReadAll
txtFile.Close
Set FSo = Nothing
Set txtFile = Nothing
End Function
Máy của bạn dùng SSD? máy tôi dùng SATA đọc chậm hơn nhiều.
Nhưng bản thân tôi thì stream cả file hay từng dòng tùy theo nhu cầu chứ chả theo tốc độ.
Ví dụ nếu chỉ cần tìm vài chuõi trong file thì stream cả file, nếu cần phân biệt dòng thì stream từng dòng.
Thì từ đầu toi đã nói đây là điển hình việc "đổ thừa sếp ngu" mờ.
Ba cái mớ parse text files này ai lại đi dùng đồ dỏm VBA. Còn đòi tăng tốc mới nực cười.
- Em xin nhờ các anh chị giúp đỡ lấy dữ liệu file excel đang đóng sang file excel đang mở bằng VBA xử dụng ADODB (ADO) - Em có ngồi kiếm code đễ sửa chữa nhưng đa số code mở lên 1 bảng chọn file, hoặc copy địa chỉ cố định. Hai vấn đề này khiến em không thể sửa code trên mạng để dùng được - Vì: +...
Lúc đầu em dung FSO rồi nhưng không dùng được. Ví dụ em muốn trích xuất tất cả các câu có chữ 領域数 và dùng chữ này làm từ khóa để tìm thì sẽ không trích xuất được câu nào cả.
Hình này là em dùng FSO đọc rồi in bằng Debug.Print, mấy câu bị lỗi là câu chứa tiếng Nhật
- Em xin nhờ các anh chị giúp đỡ lấy dữ liệu file excel đang đóng sang file excel đang mở bằng VBA xử dụng ADODB (ADO) - Em có ngồi kiếm code đễ sửa chữa nhưng đa số code mở lên 1 bảng chọn file, hoặc copy địa chỉ cố định. Hai vấn đề này khiến em không thể sửa code trên mạng để dùng được - Vì: +...