Làm thế nào để tăng tốc độ đọc File txt (>100Mb) bị Encoding

Liên hệ QC MyVTV Add-ins

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
4,250
Được thích
6,767
Cảm ơn hai anh vẫn giúp đỡ trong khi em ngủ :v

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:
Chưa chắc đọc 1 lần toàn bộ tập tin 100 MB nhanh hơn đọc từng dòng. Nếu dùng code ở bài #1 mất ít thời gian hơn thì sao lại cố dùng code ở trên?
 

ganbarou

Thành viên mới
Tham gia ngày
18 Tháng năm 2021
Bài viết
25
Được thích
3
Giới tính
Nam
Chưa chắc đọc 1 lần toàn bộ tập tin 100 MB nhanh hơn đọc từng dòng. Nếu dùng code ở bài #1 mất ít thời gian hơn thì sao lại cố dùng code ở trê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 ạ!
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
315
Được thích
171
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 !
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
11,647
Được thích
14,050
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 á.
 

tigertiger

Coming back ...
Tham gia ngày
25 Tháng một 2007
Bài viết
1,815
Được thích
1,713
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 !
Nếu đúng file Text, thì chia nhỏ ra nhiều File
Thì đọc từng File sẽ nhanh, và tìm ra Kết quả thì dừng
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
315
Được thích
171
suy luận của bạn đã có vẻ tiến hóa hơn chút , nhưng về giải pháp thì chương trình vẫn gánh 100M theo kiểu tuần tự !@@
 

tigertiger

Coming back ...
Tham gia ngày
25 Tháng một 2007
Bài viết
1,815
Được thích
1,713
suy luận của bạn đã có vẻ tiến hóa hơn chút , nhưng về giải pháp thì chương trình vẫn gánh 100M theo kiểu tuần tự !@@
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ì?
 

ganbarou

Thành viên mới
Tham gia ngày
18 Tháng năm 2021
Bài viết
25
Được thích
3
Giới tính
Nam
Thông tin em cần lấy có thể ở bất kỳ chỗ nào trong file nên bắt buộc phải đọc hết file mới biết là hết thông tin hay chưa.
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 !
làm thế nào để xử lý song song với VBA ạ, cái này em không biết!

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 á.
Hiện tại thì thời gian đọc file chiếm đến 95% thời gian, nên em mới tập trung vào vấn đề rút ngắn thời gian này
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
315
Được thích
171
làm thế nào để xử lý song song với VBA ạ, cái này em không biết!
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 !
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
11,647
Được thích
14,050
Hiện tại thì thời gian đọc file chiếm đến 95% thời gian
3.9 triệu dòng, 102MB hết có hơn 4 giây thôi.

1623294186092.png1623294206766.png


PHP:
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
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
11,647
Được thích
14,050
Thử Python hết có 0.6 giây thôi. Mỗi khi mình kêu dùng Python là tụi jav gật đầu lia lịa á. Bạn thử đề nghị với sếp xem.

1623295666319.png
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
11,741
Được thích
14,866
3.9 triệu dòng, 102MB hết có hơn 4 giây thô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.

Thử Python hết có 0.6 giây thôi. Mỗi khi mình kêu dùng Python là tụi jav gật đầu lia lịa á. Bạn thử đề nghị với sếp xem.
...
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.
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
11,647
Được thích
14,050
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.
Theo hình thớt thêm ở bài #1 từ hôm qua thì họ cần lấy dữ liệu nằm rải rác toàn file đấy anh.
 

phuongnam366377

Thành viên chính thức
Tham gia ngày
25 Tháng mười 2019
Bài viết
78
Được thích
93
100 MB ... xong tới 1GB xong =====> 10GB =====> 1000 GB thì sao ???
Tôi gợi ý chút thôi ... bài số 18 link sau
 

ganbarou

Thành viên mới
Tham gia ngày
18 Tháng năm 2021
Bài viết
25
Được thích
3
Giới tính
Nam
3.9 triệu dòng, 102MB hết có hơn 4 giây thôi.

View attachment 260376View attachment 260377


PHP:
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
FileSystemObject có làm việc với file bị encoding EUC-JP?
Thử Python hết có 0.6 giây thôi. Mỗi khi mình kêu dùng Python là tụi jav gật đầu lia lịa á. Bạn thử đề nghị với sếp xem.

View attachment 260389
Em cũng đề nghị rồi mà bị từ chối mới đau chứ :v
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.
Bình luận của anh thì em không có gì để nói :)

100 MB ... xong tới 1GB xong =====> 10GB =====> 1000 GB thì sao ???
Tôi gợi ý chút thôi ... bài số 18 link sau
Cảm ơn anh, để em tham khảo xem sao.
 

ganbarou

Thành viên mới
Tham gia ngày
18 Tháng năm 2021
Bài viết
25
Được thích
3
Giới tính
Nam
Mình cứ chép code kia vào rồi chạy, không cần chỉnh gì cả.

Tôi làm việc hàng ngày với tụi jav mà.

View attachment 260396
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
1623299798704.png
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,451
Được thích
1,397
Bạn dùng fso readall để đọc nội dung file vào string rồi dùng split để tách string vào array.
Bài đã được tự động gộp:

100 MB ... xong tới 1GB xong =====> 10GB =====> 1000 GB thì sao ???
Tôi gợi ý chút thôi ... bài số 18 link sau
Cái này là xử lý text chứ có phải csdl đâu bạn.
 
Top Bottom