Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1

    Mở và tìm kiếm trên file dung lượng lớn thì làm thế nào?

    hi all,
    Mình muốn mở 1 file dung lượng rất lớn để tìm kiếm 1 phần tử trong file đó có thể là số hoặc string...nhưng với yêu cầu là tốn ít bộ nhớ của máy nhất cho chương trình. Mình hiện tại chưa có hướng đi cho bài toán này, mình chỉ nghĩ có lẽ mình phải chia nhỏ file thành các file con để làm nhưng cũng chưa biết làm ntn. Ai có biết cách làm thì chỉ mình với nhé...
    thanks

  2. #2
    Mình chưa có kinh nghiệm trong việc này. Nên tìm giúp để bạn tham khảo thôi:

    Boolean Text Search Queries and their Processing

    Mã:
    http://www.codeproject.com/Articles/198236/Boolean-text-search-queries-and-their-processing

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cám ơn bạn. Mình đang thắc mắc việc xử lí với 1 file dung lượng lớn. Mình liệu có thể dùng hàm fopen mà mở 1 file mấy GB ko. mở đc trả về con trỏ đó nhưng rõ ràng là địa chỉ vùng nhvuweowt quá bộ nhớ chương trình. Liệu có cách nào mở file theo từng đoạn hay block ko nhỉ?

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Đối với file lớn, database thì bạn nên sử dụng File Mapping, hay còn gọi là memory-mapped file. Kỹ thuật này phụ thuộc vào hệ điều hành mà bạn cho chương trình của bạn chạy trên nó!

    Cụ thể thì hãy tìm kiếm trên MSDN nếu bạn đang có ý định thực hiện với VC++! (Kevin lười tìm và cũng lười code lắm, nhưng nếu bạn có đủ tiền trả làm cho Kevin mủi lòng thì có thể sẽ khác! [IMG]images/smilies/biggrin.png[/IMG])

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi luc13aka47
    Nhưng làm sao để mô tả position đó được ?

    Với 1 kiểu nguyên 4 bytes không dấu (unsigned long), chỉ có thể mô tả được giá trị 3Gb trở xuống. Ngoài ra, trên hệ điều hành FAT32 chỉ hỗ trợ thao tác file có dung lượng ít hơn 4Gb thì phải. NTFS thì hơn. Vấn đề bây giờ là chia file dung lượng lớn thành các file dung lượng bé hơn thế nào ? Mình nghĩ bạn nên tham khảo mã nguồn của những phần mềm chia file.
    Chia nhỏ file là phương pháp tốt và việc chia nhỏ có vấn đề gì với bạn ?
    còn việc position thì bạn có thể tính toán trước khi tìm kiếm. tôi chỉ nói đến vậy thôi. và đó là gợi ý cho bạn.
    chúc thành công.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi chuot chui
    cám ơn bạn. Mình đang thắc mắc việc xử lí với 1 file dung lượng lớn. Mình liệu có thể dùng hàm fopen mà mở 1 file mấy GB ko. mở đc trả về con trỏ đó nhưng rõ ràng là địa chỉ vùng nhvuweowt quá bộ nhớ chương trình. Liệu có cách nào mở file theo từng đoạn hay block ko nhỉ?
    Nếu chỉ mở file thì không làm sao cả cũng chả ảnh hưởng đến bộ nhớ. nếu bạn xác định được đoạn dữ liệu bạn cần nó nằm ở offset bao nhiêu thì có thể seek đến đó và chỉ đọc đoạn đó thôi.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nhưng làm sao để mô tả position đó được ?

    Với 1 kiểu nguyên 4 bytes không dấu (unsigned long), chỉ có thể mô tả được giá trị 3Gb trở xuống. Ngoài ra, trên hệ điều hành FAT32 chỉ hỗ trợ thao tác file có dung lượng ít hơn 4Gb thì phải. NTFS thì hơn. Vấn đề bây giờ là chia file dung lượng lớn thành các file dung lượng bé hơn thế nào ? Mình nghĩ bạn nên tham khảo mã nguồn của những phần mềm chia file.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi CIMinuv
    Chia nhỏ file là phương pháp tốt và việc chia nhỏ có vấn đề gì với bạn ?
    còn việc position thì bạn có thể tính toán trước khi tìm kiếm. tôi chỉ nói đến vậy thôi. và đó là gợi ý cho bạn.
    chúc thành công.
    Miêu tả position là kiểu streamsize, thường là signed int hoặc signed long, hoặc long long, ...
    => có giới hạn !

    Mã:
    http://en.cppreference.com/w/cpp/io/streamsize
    Vậy nên bạn khó có thể seek 1 lần với giá trị lớn.

    Đây là phương pháp mà anh Kevin nói đến :

    Mã:
    http://en.wikipedia.org/wiki/Memory-mapped_file
    Bạn có thể sử dụng thư viện Boost.Interprocess.

    Mã:
    http://www.boost.org/doc/libs/1_50_0/doc/html/interprocess.html

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi luc13aka47
    Miêu tả position là kiểu streamsize, thường là signed int hoặc signed long, hoặc long long, ...
    => có giới hạn !

    Mã:
    http://en.cppreference.com/w/cpp/io/streamsize
    Vậy nên bạn khó có thể seek 1 lần với giá trị lớn.

    Đây là phương pháp mà anh Kevin nói đến :

    Mã:
    http://en.wikipedia.org/wiki/Memory-mapped_file
    Bạn có thể sử dụng thư viện Boost.Interprocess.

    Mã:
    http://www.boost.org/doc/libs/1_50_0/doc/html/interprocess.html
    Có giới hạn thì chia file ra đâu có phải vấn đề gì lớn ?
    việc bạn chủ topic muốn làm là công việc của mấy bác google, bing ... đó và bạn nghĩ nó load hết dữ liệu trên internet lên để tìm mà nó có tốc độ tìm kiếm tốt vậy à ?

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi CIMinuv
    Có giới hạn thì chia file ra đâu có phải vấn đề gì lớn ?
    việc bạn chủ topic muốn làm là công việc của mấy bác google, bing ... đó và bạn nghĩ nó load hết dữ liệu trên internet lên để tìm mà nó có tốc độ tìm kiếm tốt vậy à ?
    Mình chỉ bổ sung thôi mà bạn. Có đả động gì đến ý kiến bạn đâu.

    Bạn chủ topic đang muốn tham khảo giải pháp để đọc và cách chia nhỏ 1 file dung lượng lớn.

    Còn bạn : "chia file ra đâu có phải vấn đề gì lớn ?", "Chia nhỏ file là phương pháp tốt và việc chia nhỏ có vấn đề gì với bạn ?".

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •