Cõy 2-3-4 là một vớ dụ về cõy nhiều nhỏnh, trong cõy nhiều nhỏnh
mỗi node sẽ cú nhiều hơn hai node con và nhiều hơn một mục dữ
liệụ Một loại khỏc của cõy nhiều nhỏnh là B-tree, là cõy rất hiệu
quả khi dữ liệu nằm trong bộ nhớ ngoàị Bộ lưu trữ ngoài tiờu biểu
là loại hệ thống đĩa như đĩa cứng mà ta cú thể nhỡn thấy trờn hầu hết
cỏc mỏy tớnh cỏ nhõn hoặc mỏy chủ.
Trong phần này chỳng ta sẽ bắt đầu với việc mụ tả cỏc khớa cạnh
khỏc nhau trong việc xử lý tập tin. Chỳng ta sẽ xem xột cỏch tiếp
cận đơn giản để tổ chức dữ liệu bờn ngoài: thứ tự tuần tự. Cuối
cựng, chỳng ta sẽ thảo luận về B-tree và vấn đề lưu trữ dữ liệu trờn bộ nhớ ngoàị Kết thỳc chương này là cỏch tiếp cận khỏc của lưu trữ
ngoài: đỏnh chỉ số (icunrrentexing), đõy là cỏch tiếp cận cú thể ỏp
dụng riờng hoặc kết hợp nú với B-treẹ
Một cỏch tiếp cận khỏc với cỏc khớa cạnh khỏc của lưu trữ ngoài, chẳng hạn như cỏc kỹ thuật tỡm kiếm. đú là phộp băm (hashing) trỡnh bàyở chương 2.
Chi tiết của cỏc kỹ thuật lưu trữ ngoài phụ thuộc vào từng hệ điều
hành, từng ngụn ngữ, và thậm chớ cả về phần cứng sử dụng trong
từng việc cài đặt cụ thể. Trong phần này chỳng sẽ thảo luận một
cỏch tổng quỏt hơn so với hầu hết cỏc chủ đề trong cuốn sỏch nàỵ
2.1.Truy xuất dữ liệu trờn bộ nhớ ngoài
Cỏc cấu trỳc dữ liệu mà chỳng tađó thảo luận từ trước đến giờ đa số
dựa trờn lưu trữ dữ liệu trong bộ nhớ chớnh (thường gọi là RAM, viết tắt của Racunrrentom Access Memory). Tuy nhiờn, trong một
lỳc đưa vào bộ nhớ chớnh. Trong trường hợp này cỏc kiểu lưu trữ
khỏc nhau là cần thiết. Thường cỏc tập tin trờn đĩa cú dung lượng
lớn hơn nhiều so với bộ nhớ chớnh; điều này làđỳng bởi vỡ giỏ thành khỏ rẻ của chỳng trờn một đơn vị lưu trữ.
Tất nhiờn, cỏc tập tin trờnđĩa cũng cú thuận lợi khỏc: đú là khả năng lưu trữ lõu dài của chỳng. Khi bạn tắt mỏy (hoặc nguồn điện bị hư), dữ liệu trong bộ nhớ chớnh sẽ bị mất. Cỏc tập tin trờnđĩa cú thể lưu lại dữ liệu vụ thời hạn khi nguồn điện bị tắt. Tuy nhiờn, sự khỏc biệt
chủ yếu là về kớch cỡ mà chỳng ta cần lưu ýở đõỵ
Bất lợi của việc lưu trữ ngoài là sự truy xuất chậm hơn so với bộ
nhớ chớnh. Sự khỏc biệt về tốc độ này cú thể được giải quyết bằng
cỏc kỹ thuật khỏc nhau để làm tăng tớnh tớnh hiệu quả của chỳng.
Một vớ dụ trong việc lưu trữ ngoàiđú là giả sử bạn viết một chương trỡnh cơsở dữ liệu để xử lý dữ liệu trong danh bạ điện thoại của một
thành phố cú kớch thước trung bỡnh; cỡ 500,000 mục. Mỗi mục bao
gồm tờn,địa chỉ, số điện thoại, và cỏc dữ liệu khỏc mà một cụng ty
điện thoại thường sử dụng. Giả sử mỗi mục được lưu trữ nhưlà một
mẩu tin với kớch thước 512 bytẹ Kết quả kớch của tập tin là 500,000*512=256,000,000 byte, vào khoảng 256 mờgabytẹ Chỳng ta giả sử rằng với lượng dữ liệu này là quỏ lớn so với bộ nhớ chớnh
của một mỏy tớnh nàođú, nhưng sẽ trở nờn rất nhỏ để lưu trữ trờn ổ
đĩạ
Kết quả là bạn cú một số lượng lớn dữ liệu trờn đĩạ Làm thế nào bạn cấu trỳc nú để thực hiện cỏc tớnh năng thụng dụng mong muốn:
tỡm kiếm, chốn, xoỏ nhanh? Cú hai vấn đề cần xem xột:
Việc truy cập dữ liệu trờn đĩa chậm hơn nhiều so với truy
cập trờn bộ nhớ chớnh.
Thứ hai là việc truy cập nhiều mẩu tin cựng một lỳc. Truy xuất chậm
Bộ nhớ chớnh của mỏy tớnh làm việc với tớn hiệu điện tử. Bất kỳ byte
nào cũng cú thể truy cập nhanh như cỏc byte khỏc, với một phần
nhỏ của micro giõy (bằng 1/1,000,000 của giõy).
Để truy cập một phần cụ thể dữ liệu trờn ổ đĩa, đầu đọc/ghi trước
tiờn phải dịch chuyển đến rónh phự hợp. Điều này được thực hiện
bởi một mụ tơ, hoặc thiết bị tương tự: đõy là hoạt động cơkhớ chiếm
vài milli giõy (bằng 1/1,000 của giõy).
Kết quả là, thời gian truy cập ổ đĩa thường vào khoảng 10 milli giõỵ
Điều này cú nghĩa là chậm hơn 10,000 lần so với truy cập bộ nhớ
chớnh.
Sự phỏt triển của kỹ thuật đó giảm thời gian truy xuất đĩa theo thời
gian, nhưng thời gian truy xuất bộ nhớ chớnh giảm xuống nhanh hơn so với truy cập đĩa, vỡ thế sự chờnh lệch giữa thời gian truy xuất bộ
chớnh vàổ đĩa sẽ ngày càng lớn trong tương laị
Truy xuất khối (block)
Một khi đóđịnh vị đỳng vị trớ và tiến trỡnh đọc (ghi) bắt đầu, ổ đĩa cú thể chuyển một lượng lớn dữ liệu vào bộ nhớ chớnh một cỏch
nhanh chúng và chớnh xỏc.Để làmđược việc này và cũng nhằm đơn giản cơchế điều khiển ổ đĩa, dữ liệu được lưu trữ trờnđĩa thành cỏc nhúm gọi là block, pages, allocation units, hoặc một vài tờn gọi khỏc
tuỳ thuộc vào hệ điều hành. ở đõy chỳng ta sẽ gọi chỳng là khối
(block).
Kớch cỡ của khối biến đổi tuỳ thuộc vào từng hệ điều hành. Kớch thước của ổ đĩa với cỏc yếu tố khỏc, thường là luỹ thừa của 2. Đối
với vớ dụ về danh bạ điện thoại nhưnờuở trước, giả sử một khối cú
kớch thước là 8,192 byte (213). Kết quả là cơsở dữ liệu danh bạ điện
thoại sẽ cần 256,000,000 byte chia cho 8,192 byte trờn một khối,
nghĩa là sẽ cú 31,250 khốị
Chương trỡnh sẽ hiệu quả khi nú yờu cầu thao tỏcđọc hoặc ghi với
kớch thước là bội số của kớch thước khốị Nếu muốn đọc 100 byte,
sẽ khụng dựng đến. Hoặc nếu muốn đọc là 8,200 byte, hệ thống sẽ
đọc 2 khối hay 16,384 byte nhưng chỉ lấy hơn một nửa của số byte
này (8,200). Vỡ thế bạn phải tổ chức chương trỡnh sao cho tại mỗi
thời điểm nú chỉ làm việc trờn một khối dữ liệu, điều này sẽ làm tối
ưu sự truy xuất.
Giả sử kớch thước mỗi mẩu tin của danh bạ điện thoại là 512 byte, bạn cú thể lưu 16 mẩu tin thành một khối (8,192 chia cho 512), như trỡnh bày ở hỡnh 4.11. Vỡ thế, để tớnh hiệu quả đạt đến mức tối đa bạn phải đọc 16 mẩu tin tại mỗi thời điểm (hoặc là một bội số của
16).
Kớch thước mỗi mẩu tin thường là bội số của 2. Điều này làm cho số
lượ ng toàn bộ của chỳ ng sẽ luụ n luụn vừa với một khốị
Kớch thước trỡnh bày trong vớ dụ danh bạ điện thoại của mẩu tin,
khối,... chỉ là minh họa; Chỳng sẽ biến đổi phụ thuộc vào số lượng
và kớch thước của mẩu tin và cỏc ràng buộc về phần cứng và phần
mềm khỏc. Khối thường chứa đựng hàng trăm mẩu tin, và cỏc mẩu
tin này cú thể lớn hơn hoặc nhỏ hơn 512 bytẹ
Một khi đầu đọc/ghi định vị đỳng vị trớ (như đó trỡnh bày ở trờn), việc đọc một khối rất nhanh, chỉ tốn vài milli giõỵ Vỡ thế, việc truy
cập ổ đĩa để đọc hoặc ghi mỗi khối sẽ khụng phụ thuộc vào kớch thước của khốị Điều này cú nghĩa là khối càng lớn thỡ càng cú hiệu
quả khi bạn đọc hoặc viết một mẩu tin đơn (giả sử bạn sử dụng tất
cả cỏc mẩu tin trong khối).
Thứ tự tuần tự
Cú một cỏch để sắp xếp dữ liệu danh bạ điện thoại của tập tin trờn đĩađú là sắp xếp tất cả mẩu tin theo một vài khúa nàođú, giả sử sắp
theo thứ tự alpha của họ. Nếu vậy thỡ mẩu tin của Joseph Aardvark
là mẩu tin đầu tiờn, v.v.Điều nàyđược trỡnh bày trong hỡnh 4.12.
Tỡm kiếm
Để tỡm kiếm trờn một tập tin cú thứ tự tuần tự theo họ, cụ thể là Smith, bạn cú thể sử dụng thuật toỏn tỡm kiếm nhị phõn. Bạn bắt đầu
bằng việc đọc một khối cỏc mẩu tin từ chớnh giữa của tập tin. 16
mẩu tin trong khối được đọc cựng một lỳc vào một vựng đệm cú
kớch thước 8,192 byte của bộ nhớ chớnh.
File =256,000,000 bytes
Hỡnh 4.11Khối và mẩu tin
Record Record Record Record
TEN TEN TEN TEN
DIACHI DIACHI DIACHI DIACHI
PHONE PHONE PHONE PHONE
…. …. …. ….
Block Block Block Block Block
0 1 2 31,248 31,249
8,192bytes bytes
0 1 2 15