Lối Out of memory

Liên hệ QC

pt_hcl

Thành viên hoạt động
Tham gia
15/2/11
Bài viết
138
Được thích
2
- Mình có đoạn code do GPE giúp đỡ, nhưng khi tăng số cột hoặc số dòng lên thì nó báo lỗi Out of memory (mình sử lí cho 966748 dòng, 100 cột). Mình nghĩ là do dung lượng file quá lớn lên khoảng gần 300Mb nên không lưu lại được. Nguyên nhân có thể là do trong code có tô màu cho kết quả tìm được dẫn đến dung lượng lớn bị out ra, nay nhờ GPE có thể giúp vô hiệu hóa phần tô màu (giảm dung lượng lưu) hoặc tối ưu code như thế nào ạ? (Mình dùng máy 2.20 GHz và Ram 12Gb)
- Mình thấy báo Out of memory chỗ đoạn code: Arr1 = Rng.Value
- Vì dung lượng file quá lớn nên mình không gửi được file lên. Mong GPE xem giúp! Xin cảm ơn GPE

Sub MaxBlanksInRows2()
Dim Arr1, Arr2, Rng As Range, dau As Long, iCot As Long, iCol As Long
Dim iRow As Long, i As Long, j As Long, t As Long, trong As Long
iCol = Cells(3, 1500).End(xlToLeft).Column
iRow = Cells(1000000, iCol - 101).End(xlUp).Row
Set Rng = Range(Cells(4, iCol - 100), Cells(iRow, iCol))
Rng.Select
Rng.Interior.ColorIndex = 0
Arr1 = Rng.Value
ReDim Arr2(1 To iRow - 3, 1 To 1)
For i = 1 To UBound(Arr1, 1)
dau = Cells(i + 3, iCol - 101).End(xlToRight).Column - iCol + 101
For j = dau To UBound(Arr1, 2)
If Arr1(i, j) = "" Then
t = t + 1
Else
If trong < t Then trong = t: iCot = j
t = 0
End If
Next
Arr2(i, 1) = trong
Range(Cells(i + 3, iCot + iCol - 102 - trong + 1), Cells(i + 3, iCot + iCol - 102)).Interior.ColorIndex = 33
trong = 0
iCot = 0
Next
Cells(4, iCol - iCol + 2).Resize(i - 1) = Arr2
End Sub
 
- Mình có đoạn code do GPE giúp đỡ, nhưng khi tăng số cột hoặc số dòng lên thì nó báo lỗi Out of memory (mình sử lí cho 966748 dòng, 100 cột). Mình nghĩ là do dung lượng file quá lớn lên khoảng gần 300Mb nên không lưu lại được. Nguyên nhân có thể là do trong code có tô màu cho kết quả tìm được dẫn đến dung lượng lớn bị out ra, nay nhờ GPE có thể giúp vô hiệu hóa phần tô màu (giảm dung lượng lưu) hoặc tối ưu code như thế nào ạ? (Mình dùng máy 2.20 GHz và Ram 12Gb)
- Mình thấy báo Out of memory chỗ đoạn code: Arr1 = Rng.Value
- Vì dung lượng file quá lớn nên mình không gửi được file lên. Mong GPE xem giúp! Xin cảm ơn GPE

Bạn thực hiện tại sheet nào thì gửi cái file ở sheet đó lên thôi, nén lại mà gửi để tôi còn biết cách bạn thực hiện có đúng với cách mà code nó thể hiện hay không mới biết lỗi hay phải.

Bạn thử dùng thủ tục dưới đây xem còn lỗi hay không, nếu còn thì bạn gửi file lên thôi nhé!

Mã:
Sub MaxBlanksInRows2()
    Dim Arr1, Arr2, Rng As Range, dau As Long, iCot As Long, iCol As Long
    Dim iRow As Long, i As Long, j As Long, t As Long, trong As Long
    iCol = Cells(3, 16384).End(xlToLeft).Column
    iRow = Cells(1048576, iCol - 101).End(xlUp).Row
    Set Rng = Range(Cells(4, iCol - 100), Cells(iRow, iCol))
    Rng.Interior.ColorIndex = 0
    Arr1 = Rng
    ReDim Arr2(1 To iRow - 3, 1 To 1)
    For i = 1 To UBound(Arr1, 1)
        dau = Cells(i + 3, iCol - 101).End(xlToRight).Column - iCol + 101
        For j = dau To UBound(Arr1, 2)
            If Arr1(i, j) = "" Then
                t = t + 1
            Else
                If trong < t Then trong = t: iCot = j
                t = 0
            End If
        Next
        Arr2(i, 1) = trong
        Range(Cells(i + 3, iCot + iCol - 102 - trong + 1), Cells(i + 3, iCot + iCol - 102)).Interior.ColorIndex = 33
        trong = 0
        iCot = 0
    Next
    Cells(4, iCol - iCol + 2).Resize(i - 1) = Arr2
    Set Rng = Nothing
End Sub
 
Bị hết memory là phải rồi.
VBA trong Excel 2010 chỉ cho array loại variant tới khoảng gần 25 triệu. Integer có thể nhiều hơn.
Array của bạn 1000000x100 là trăm triệu
Nếu bạn muốn làm việc tới con số đó thì xác định array của mình là integer.
Nếu giá trị không xác định (bắt buộc phải dùng variant) thì làm việc thẳng trên range, đừng đổi qua array.
 
Xin cảm ơn GPE! Vì nick kia mình hết dung lượng gửi file nên xin dùng tài khoản này ạ! Mình xin gửi kèm file xử lí với số dòng 5 - cột 200. Mong các bạn thử test với số dòng 966748 - cột 200 là bị out of momery ngay! Mong các bạn giúp đỡ!
 

File đính kèm

  • 966748DONG-200COT.rar
    19.7 KB · Đọc: 12
... Mong các bạn thử test với số dòng 966748 - cột 200 là bị out of momery ngay! Mong các bạn giúp đỡ!

Không cần phải téc tiếc gì cả. Array dùng bộ nhớ liên tục (trên tính chất vật lý) nên chuyện thiếu memory là chuyện dân lập trình ai cũng biết. Chỉ cần viết một đoạn code debug là biết nó thực sự hết ở khoảng nào.

Vấn đề của bạn là chờ tác giả của đoạn code trên vào sửa lại cho bạn. Tuy nhiên, kỹ thuật partioned array khá phức tạp. Dùng số lượng lớn như bạn thì chẳng chóng thì chầy lại hết memory chỗ khác. Tốt hơn hết là bạn tự tìm hiểu code trên và chỉnh nó.
 
Không cần phải téc tiếc gì cả. Array dùng bộ nhớ liên tục (trên tính chất vật lý) nên chuyện thiếu memory là chuyện dân lập trình ai cũng biết. Chỉ cần viết một đoạn code debug là biết nó thực sự hết ở khoảng nào.

Vấn đề của bạn là chờ tác giả của đoạn code trên vào sửa lại cho bạn. Tuy nhiên, kỹ thuật partioned array khá phức tạp. Dùng số lượng lớn như bạn thì chẳng chóng thì chầy lại hết memory chỗ khác. Tốt hơn hết là bạn tự tìm hiểu code trên và chỉnh nó.

Anh ơi code debug nó như thế nào chỉ cho em với được không? Dữ liệu của em có 170.000 dòng x 12 cột (Sử dụng win 10 64bit ram 4Gb) khi xuất ra dữ liệu đíc chỉ còn hơn 3000 dòng và 125 cột mà nó cũng báo lỗi Out of memory.
 
Anh ơi code debug nó như thế nào chỉ cho em với được không? Dữ liệu của em có 170.000 dòng x 12 cột (Sử dụng win 10 64bit ram 4Gb) khi xuất ra dữ liệu đíc chỉ còn hơn 3000 dòng và 125 cột mà nó cũng báo lỗi Out of memory.
Bạn đưa cái file khủng đó lên xem nào.
 
@
tueyennhi
lắp thêm 1 cây RAM 4G nữa là 8G + thay con CPU đó đi là CPU i7 thế hệ mới nhất là hết à
 
Web KT

Bài viết mới nhất

Back
Top Bottom