2012-05-21 57 views
8

Tôi có một đĩa ngoài với một tỷ tệp. Nếu tôi gắn đĩa ngoài vào máy tính A, chương trình của tôi sẽ quét tất cả đường dẫn của tệp và lưu đường dẫn của tệp trong bảng cơ sở dữ liệu. Sau đó, khi tôi đẩy đĩa ngoài, những dữ liệu đó sẽ vẫn còn trong bảng. Vấn đề là, nếu một số tập tin bị xóa trong máy tính B, và tôi gắn nó vào máy tính Một lần nữa, tôi phải đồng bộ hóa bảng cơ sở dữ liệu trong máy tính A. Tuy nhiên, tôi không muốn quét tất cả các tệp một lần nữa vì nó mất một thời gian rất nhiều và lãng phí một bộ nhớ rất nhiều. Có cách nào để cập nhật bảng cơ sở dữ liệu mà không quét tất cả các tệp trong khi giảm thiểu bộ nhớ được sử dụng không?Xử lý một số lượng lớn các tệp

Bên cạnh đó, trong trường hợp của tôi, giới hạn bộ nhớ quan trọng hơn thời gian. Điều đó có nghĩa là tôi muốn tiết kiệm nhiều bộ nhớ hơn là tiết kiệm nhiều thời gian hơn.

Tôi nghĩ rằng tôi có thể cắt các tệp thành nhiều phần và sử dụng một số chức năng cụ thể (có thể là SHA1?) Để kiểm tra xem các tệp trong phần này có bị xóa hay không. Tuy nhiên, tôi không thể tìm ra cách để cắt các tập tin vào các phần. Bất cứ ai có thể giúp tôi hoặc cho tôi những ý tưởng tốt hơn?

+0

Xóa như sau: Xóa dựa trên hệ thống mà bạn không kiểm soát được? hoặc Xóa được kích hoạt bởi một số ứng dụng mà bạn có thể làm điều gì đó? – Krrose27

+0

Tại sao quá trình quét sử dụng nhiều bộ nhớ? Về cơ bản bạn chỉ liệt kê các tệp trong một thư mục cùng một lúc, đúng không? – Joni

+0

Vâng, tuy nhiên, tôi không thể kiểm soát số lượng tệp trong thư mục trên. Một thư mục có thể có 1 tỷ tệp. Bên cạnh đó, nếu tôi chèn một dữ liệu khi tôi quét một tập tin ngay lập tức, nó sẽ tiết kiệm rất nhiều bộ nhớ nhưng thực sự tốn thời gian vì các vấn đề I/O. Nếu tôi sử dụng chèn số lượng lớn, nó sẽ hiệu quả hơn. – s011208

Trả lời

0

Về lý thuyết, bạn có thể tăng tốc mọi thứ bằng cách kiểm tra dấu thời gian "đã sửa đổi" trên các thư mục. Nếu một thư mục chưa được sửa đổi, thì bạn không cần phải kiểm tra bất kỳ tệp nào trong thư mục đó. Thật không may, bạn cần phải quét các thư mục con có thể, và tìm chúng liên quan đến việc quét thư mục ... trừ khi bạn đã lưu cấu trúc cây thư mục.

Và tất nhiên, điều này là tranh luận rằng bạn đã có một thư mục phẳng chứa một tỷ tệp.


Tôi tưởng tượng bạn đang lắp ráp tất cả các tệp trong bộ nhớ để có thể sắp xếp chúng trước khi truy vấn cơ sở dữ liệu. (Và phân loại chúng là một ý tưởng TỐT ...) Tuy nhiên, có một giải pháp thay thế để sắp xếp trong bộ nhớ:

  1. Viết tập tin vào tập tin.
  2. Sử dụng tiện ích sắp xếp bên ngoài để sắp xếp tệp thành thứ tự khóa chính.
  3. Đọc tệp đã sắp xếp và thực hiện truy vấn theo lô đối với cơ sở dữ liệu theo thứ tự chính.

(Bạn có thực sự có một tỷ tập tin trên đĩa? Đó có vẻ là một thiết kế xấu cho lưu trữ dữ liệu của bạn ...)

+0

Tôi sẽ không bao giờ đặt một tỷ tập tin trong một ổ đĩa ngoài, nó thực sự là một thảm họa; tuy nhiên, tôi không thể hứa rằng tất cả người dùng sẽ không làm như vậy. – s011208

+0

@ s011208 - tôi rất muốn nói với người dùng rằng đó là lỗi của họ nếu hệ thống của bạn mất nhiều thời gian khi họ đặt một số lượng vô lý các tệp trên đĩa. –

1

Nếu bạn không có quyền kiểm soát các hệ thống tập tin trên đĩa bạn không có lựa chọn nào khác ngoài việc quét các tên tệp trên toàn bộ đĩa. Để liệt kê các tập tin đã bị xóa, bạn có thể làm điều gì đó như thế này:

update files in database: set "seen on this scan" to false 
for each file on disk do: 
    insert/update database, setting "seen on this scan" to true 
done 
deleted files = select from files where "seen on this scan" = false 

Một giải pháp cho vấn đề hiệu suất db có thể được tích lũy các tên tập tin vào một danh sách của một số loại và làm một số lượng lớn chèn/cập nhật bất cứ khi nào bạn đạt được, nói rằng, 1000 tập tin.

Đối với thư mục có 1 tỷ tệp, bạn chỉ cần thay thế mã liệt kê các tệp có thứ gì đó bao bọc các hàm C opendirreaddir. Nếu tôi là bạn sẽ không lo lắng về nó quá nhiều cho bây giờ. Không có người lành mạnh nào có 1 tỷ tập tin trong một thư mục bởi vì loại điều đó làm tê liệt hệ thống tệp và các công cụ hệ điều hành phổ biến, vì vậy rủi ro thấp và giải pháp dễ dàng.

+0

Giải pháp của bạn là hệ thống android thực sự làm gì! Nhưng nhược điểm của giải pháp này là bạn phải lưu trữ các thuộc tính của tập tin trong bộ nhớ, nói bản đồ. Tuy nhiên, Android có giới hạn bộ nhớ! Khi bạn chỉ có 10 nghìn tập tin, tiền phạt của nó. Nếu bạn có hơn trăm nghìn tệp, chương trình sẽ bị buộc phải hoàn thành. Bây giờ cũng giống như câu hỏi của tôi, tôi muốn tìm ra cách để cắt tất cả các tệp trong đĩa thành các phần để tôi có thể thực hiện một phần cùng một lúc và tránh vấn đề giới hạn bộ nhớ! – s011208

+1

Tại sao các thuộc tính của tệp phải được lưu trữ trong RAM, đó là những gì cơ sở dữ liệu dành cho, phải không? Hoặc bạn có nghĩa là danh sách tạm thời được sử dụng cho chèn số lượng lớn? Bạn có thể chọn kích thước hàng loạt động dựa trên bộ nhớ có sẵn thay vì sử dụng kích thước sửa ... – Joni

0

Bạn có danh sách những gì đã bị xóa khi xóa xảy ra (hoặc thay đổi bất kỳ quá trình nào xóa để tạo điều này)?Nếu không, bạn có thể có danh sách "Tôi đã bị xóa" với dấu thời gian và sau đó chọn các mục từ danh sách này để chỉ đồng bộ hóa về những gì đã thay đổi? Đương nhiên, bạn vẫn muốn có một số loại công việc hàng loạt để đồng bộ hóa trong một thời gian chậm trên máy chủ, nhưng tôi nghĩ rằng có thể làm giảm tải.

Tùy chọn khác có thể, tùy thuộc vào những gì đang thay đổi mã, để có quá trình đó chỉ cập nhật cơ sở dữ liệu (nếu bạn có nhiều nút) trực tiếp khi nó xóa. Điều này sẽ giới thiệu một số khớp nối vào các hệ thống, nhưng sẽ là cách hiệu quả nhất để làm điều đó.

Cách tốt nhất theo ý kiến ​​của tôi là một số biến thể trên ý tưởng của tin nhắn mà một delete đã xảy ra (ngay cả khi đó chỉ là một tập tin mà bạn viết thư cho một số nơi với một danh sách các tập tin vừa xóa), hoặc một số loại trực tiếp cơ chế gọi lại, hoặc thông qua mã hoặc chỉ cần điều chỉnh lưu trữ dữ liệu liên tục mà ứng dụng sử dụng trực tiếp từ quá trình xóa. Ngay cả với tất cả điều này đã nói, bạn sẽ luôn luôn cần phải có một số loại đồng bộ hóa chỉ mục hoặc kiểm tra sanity định kỳ trên các chỉ mục để đảm bảo rằng mọi thứ được khớp chính xác.

Bạn có thể (và tôi sẽ bị sốc nếu bạn không phải dựa vào số lượng tệp mà bạn có) phân vùng ra khỏi không gian tệp vào các thư mục với 5.000-10.000 tệp trên mỗi thư mục và sau đó tạo một tệp đơn giản có băm tên của tất cả các tệp trong thư mục. Điều này sẽ bắt xóa, nhưng tôi vẫn nghĩ rằng một cuộc gọi lại trực tiếp của một số hình thức khi xóa xảy ra là một ý tưởng tốt hơn nhiều. Nếu bạn có một thư mục nguyên khối với tất cả những thứ này, hãy tạo thứ gì đó để chia thành các thư mục riêng biệt (chúng tôi sử dụng số đơn giản dưới thư mục chính để chúng tôi có thể tiếp tục quảng cáo). ngay cả khi bạn phải làm điều này cho tất cả các tập tin mới và để lại các tập tin cũ tại chỗ như là, ít nhất bạn có thể ngừng chảy máu trên các tập tin hồi. Theo quan điểm của tôi, vì bạn đang kiểm soát một chỉ mục của các tệp, nên bạn thực sự có cùng một chương trình liên quan (hoặc được thông báo) khi thay đổi xảy ra tại thời điểm thay đổi hệ thống tệp cơ bản, trái ngược với việc cho phép thay đổi xảy ra và sau đó xem xét mọi thứ để cập nhật. Đương nhiên, để nắm bắt các ngoại lệ mà thông tin liên lạc này bị hỏng, bạn cũng nên có mã đồng bộ để thực sự kiểm tra những gì có trong hệ thống tệp và cập nhật chỉ mục định kỳ (mặc dù điều này có thể và có thể được xử lý theo lô cho ứng dụng chính).

0

Nếu bộ nhớ quan trọng, tôi sẽ sử dụng các thiết bị của hệ điều hành.

Nếu bạn có ext4, tôi sẽ cho rằng bạn đang sử dụng Unix (bạn có thể cài đặt tìm trên các hệ điều hành khác như Win). Nếu đây là trường hợp bạn có thể sử dụng lệnh tìm gốc (điều này sẽ dành cho phút cuối cùng, bạn có thể nhớ thời gian quét cuối cùng và sửa đổi điều này thành bất kỳ điều gì bạn thích): find/directory_path -type f -mtime -1 -print

Tất nhiên bạn sẽ không bị xóa. Nếu một thuật toán heuristic làm việc cho bạn thì bạn có thể tạo một chuỗi từ từ đi tới từng tệp được lưu trữ trong cơ sở dữ liệu của bạn (bất cứ thứ gì bạn cần hiển thị trước rồi từ mới trở lên) và kiểm tra nó vẫn còn trực tuyến. Điều này sẽ không tiêu tốn nhiều bộ nhớ. Tôi nghĩ rằng bạn sẽ không thể hiển thị một tỷ tập tin cho người dùng anyway.

Các vấn đề liên quan