2009-09-22 43 views
20

Tại sao phải mất 5 phút để tạo một tệp KiB 1 trên hệ thống máy tính xách tay (máy tính xách tay cấp thấp) của tôi với ít tải? Và làm thế nào tôi có thể tạo một tệp nhị phân ngẫu nhiên nhanh hơn?Tạo một tệp nhị phân ngẫu nhiên

$ time dd if=/dev/random of=random-file bs=1 count=1024 
1024+0 records in 
1024+0 records out 
1024 bytes (1.0 kB) copied, 303.266 s, 0.0 kB/s 

real 5m3.282s 
user 0m0.000s 
sys 0m0.004s 
$ 

Lưu ý rằng dd if=/dev/random of=random-file bs=1024 count=1 không hoạt động. Nó tạo ra một tệp nhị phân ngẫu nhiên có độ dài ngẫu nhiên, trên hầu hết các lần chạy dưới 50 B. Có ai giải thích cho điều này không?

+0

Rất khó chọn câu trả lời được chấp nhận vì cả hai đều đúng và được đăng trong cùng một phút. Tôi chọn người có nhiều phiếu nhất, tôi ước tôi có thể chọn cả hai. –

Trả lời

26

Đó là vì trên hầu hết các hệ thống /dev/random sử dụng dữ liệu ngẫu nhiên từ môi trường, chẳng hạn như tĩnh từ thiết bị ngoại vi. Nhóm dữ liệu ngẫu nhiên thực sự (entropy) mà nó sử dụng rất hạn chế. Cho đến khi có nhiều dữ liệu hơn, các khối đầu ra.

Thử lại thử nghiệm của bạn với /dev/urandom (thông báo u) và bạn sẽ thấy tăng tốc đáng kể.

Xem Wikipedia để biết thêm thông tin. /dev/random không luôn luôn xuất dữ liệu ngẫu nhiên thực sự, nhưng rõ ràng trên hệ thống của bạn.

Ví dụ với /dev/urandom:

$ time dd if=/dev/urandom of=/dev/null bs=1 count=1024 
1024+0 records in 
1024+0 records out 
1024 bytes (1.0 kB) copied, 0.00675739 s, 152 kB/s 

real 0m0.011s 
user 0m0.000s 
sys 0m0.012s 
12

Hãy thử /dev/urandom thay vì:

$ time dd if=/dev/urandom of=random-file bs=1 count=1024 

Từ: http://stupefydeveloper.blogspot.com/2007/12/random-vs-urandom.html

Sự khác biệt chính giữa ngẫu nhiên và urandom là làm thế nào họ đang kéo dữ liệu ngẫu nhiên từ hạt nhân. ngẫu nhiên luôn lấy dữ liệu từ entropy pool. Nếu hồ bơi trống, ngẫu nhiên sẽ chặn các hoạt động cho đến khi hồ bơi sẽ được lấp đầy đủ. urandom sẽ genarate dữ liệu bằng cách sử dụng thuật toán SHA (hoặc bất kỳ thuật toán khác, MD5 đôi khi) trong trường hợp entropy của hạt nhân trống. urandom sẽ không bao giờ chặn hoạt động.

3

Tôi đã viết một kịch bản để kiểm tra chức năng băm khác nhau tốc độ. Đối với điều này tôi muốn các tập tin của dữ liệu "ngẫu nhiên", và tôi không muốn sử dụng cùng một tập tin hai lần để không ai trong số các chức năng có một lợi thế bộ nhớ cache hạt nhân hơn khác. Tôi thấy rằng cả hai/dev/random và/dev/urandom đều rất chậm. Tôi đã chọn để sử dụng dd để sao chép dữ liệu của đĩa cứng của tôi bắt đầu từ offsets ngẫu nhiên. Tôi sẽ KHÔNG BAO GIỜ đề nghị sử dụng này nếu bạn đang làm bất cứ điều gì liên quan đến an ninh, nhưng nếu tất cả bạn cần là tiếng ồn nó không quan trọng, nơi bạn nhận được nó. Trên máy Mac sử dụng một cái gì đó giống như/dev/disk0 trên Linux sử dụng/dev/sda

Đây là kịch bản thử nghiệm hoàn chỉnh:

tests=3 
kilobytes=102400 
commands=(md5 shasum) 
count=0 
test_num=0 
time_file=/tmp/time.out 
file_base=/tmp/rand 

while [[ test_num -lt tests ]]; do 
    ((test_num++)) 
    for cmd in "${commands[@]}"; do 
     ((count++)) 
     file=$file_base$count 
     touch $file 
     # slowest 
     #/usr/bin/time dd if=/dev/random of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file 
     # slow 
     #/usr/bin/time dd if=/dev/urandom of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file                           
     # less slow 
     /usr/bin/time sudo dd if=/dev/disk0 skip=$(($RANDOM*4096)) of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file 
     echo "dd took $(tail -n1 $time_file | awk '{print $1}') seconds" 
     echo -n "$(printf "%7s" $cmd)ing $file: " 
     /usr/bin/time $cmd $file >/dev/null 
     rm $file 
    done 
done 

Dưới đây là "ít chậm" Kết quả/dev/disk0:

dd took 6.49 seconds 
    md5ing /tmp/rand1:   0.45 real   0.29 user   0.15 sys 
dd took 7.42 seconds 
shasuming /tmp/rand2:   0.93 real   0.48 user   0.10 sys 
dd took 6.82 seconds 
    md5ing /tmp/rand3:   0.45 real   0.29 user   0.15 sys 
dd took 7.05 seconds 
shasuming /tmp/rand4:   0.93 real   0.48 user   0.10 sys 
dd took 6.53 seconds 
    md5ing /tmp/rand5:   0.45 real   0.29 user   0.15 sys 
dd took 7.70 seconds 
shasuming /tmp/rand6:   0.92 real   0.49 user   0.10 sys 

Sau đây là các "chậm" Kết quả/dev/urandom:

dd took 12.80 seconds 
    md5ing /tmp/rand1:   0.45 real   0.29 user   0.15 sys 
dd took 13.00 seconds 
shasuming /tmp/rand2:   0.58 real   0.48 user   0.09 sys 
dd took 12.86 seconds 
    md5ing /tmp/rand3:   0.45 real   0.29 user   0.15 sys 
dd took 13.18 seconds 
shasuming /tmp/rand4:   0.59 real   0.48 user   0.10 sys 
dd took 12.87 seconds 
    md5ing /tmp/rand5:   0.45 real   0.29 user   0.15 sys 
dd took 13.47 seconds 
shasuming /tmp/rand6:   0.58 real   0.48 user   0.09 sys 

Dưới đây là là những "chậm nhất"/dev/kết quả ngẫu nhiên:

dd took 13.07 seconds 
    md5ing /tmp/rand1:   0.47 real   0.29 user   0.15 sys 
dd took 13.03 seconds 
shasuming /tmp/rand2:   0.70 real   0.49 user   0.10 sys 
dd took 13.12 seconds 
    md5ing /tmp/rand3:   0.47 real   0.29 user   0.15 sys 
dd took 13.19 seconds 
shasuming /tmp/rand4:   0.59 real   0.48 user   0.10 sys 
dd took 12.96 seconds 
    md5ing /tmp/rand5:   0.45 real   0.29 user   0.15 sys 
dd took 12.84 seconds 
shasuming /tmp/rand6:   0.59 real   0.48 user   0.09 sys 

Bạn sẽ nhận thấy/dev/random và/dev/urandom không có nhiều tốc độ khác nhau. Tuy nhiên,/dev/disk0 mất 1/2 thời gian.

PS.Tôi làm giảm số lượng các bài kiểm tra và loại bỏ tất cả, nhưng 2 lệnh vì lợi ích của "ngắn gọn" (không phải là tôi đã thành công trong ngắn gọn).

0

Chủ đề cũ nhưng tôi chỉ cần điều tương tự. Người bạn cũ C đến giải cứu vì tôi không muốn lộn xộn xung quanh với kịch bản. Đây là giải pháp của tôi đó là tốt và đủ nhanh cho tôi:

// usage: ./program <outfile> <size-in-bytes> 
#include <stdio.h> 
void main(int argc, char** argv){ 
    long long i, s; 
    FILE* f = fopen(*(argv+1), "w"); 
    srand(time(NULL)); 
    sscanf(*(argv+2), "%lld", &s); 
    for(i=0;i<s;i++){ 
     fputc(rand()%255,f); 
    } 
    fclose(f); 
} 
2

Cũ chủ đề, nhưng cũng giống như Tobbe đã đề cập, tôi cần một cái gì đó như thế này chỉ tốt hơn (nhanh hơn).

Vì vậy ... một cách thức làm giống như vậy, nhanh hơn, ngẫu nhiên/urandom, hữu ích khi tạo các tệp lớn, tôi thừa nhận không hoàn toàn ngẫu nhiên, nhưng đủ gần, phụ thuộc vào nhu cầu của bạn.

dd if=/dev/mem of=test1G.bin bs=1M count=1024 
touch test100G.bin 
seq 1 100 | xargs -Inone cat test1G.bin >> test100G.bin 

Điều này sẽ tạo ra một file 100Gb từ nội dung của ram của bạn (1GB đầu tiên, tôi giả sử bạn có quá nhiều ram :)) Lưu ý rằng nó cũng có thể không an toàn để chia sẻ tệp này vì nó có thể chứa tất cả các loại dữ liệu nhạy cảm như mật khẩu của bạn, vì vậy hãy sử dụng nó chỉ vì những nguyên nhân của chính bạn :) Ồ, và bạn cần chạy nó như là root cho cùng một lý do.

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