Mình không hiểu ý bạn lắm, bạn đang giả lập database bằng C?
code chưa index trường id
Mình muốn index trường id vậy mình phải code như thế nào?Code:#include<stdio.h> void main() { FILE *fp = fopen("C:\\data.db","ab+"); int id=1; fwrite(&id,sizeof(id),1,fp); char filename[] = "abc.mp3"; fwrite (filename, 1 , sizeof(filename)-1 , fp); fclose(fp); }
Mình không hiểu ý bạn lắm, bạn đang giả lập database bằng C?
Mình đang làm một chương trình copy file từ đĩa cứng này qua đĩa cứng khác
do số lượng file cần copy quá lớn nên mình quết định dùng database
một database mini chỉ có 3 trường (int id, path char[100], bool check)
trong đó:
id số thứ tự
path: tên đường dẫn
bool: paste thành công sẽ bằng 1 và ngược lại bằng 0
khi mình lấy dữ liệu từ database ở id khoảng 0 - 500.000 thì còn tàm tạm nhưng tầm 500.000 trờ đi thì rất lâu nên mình mới tìm hiểu về cách dọc ghi file thì thấy bảo là đánh index sẽ nhanh hơn
nhưng mình không biết phải đánh index như thế nào ?
bạn nào biết chỉ mình với [thank]
Bạn cho mình đoạn code bạn viết + dữ liệu được không?
Mình không hiểu tốc độ ghi và đọc file tại sao lại phụ thuộc vào id, bạn có thể giải thích thêm không?khi mình lấy dữ liệu từ database ở id khoảng 0 - 500.000 thì còn tàm tạm nhưng tầm 500.000 trờ đi thì rất lâu nên mình mới tìm hiểu về cách dọc ghi file thì thấy bảo là đánh index sẽ nhanh hơn
Thường thì nếu có dùng external thì đọc và ghi chắc chắn sẽ chậm hơn rất nhiều, cách mình nghĩ ra tạm thời chắc là phải dùng pipe(), tạo ra các thread xong xong ghi vào. Thêm nữa bạn đang làm trong môi trường nào thế? (HDH)
kiểu như các phần mêm quản lý database như sql, mysql ý cần có một biến id để xử lý dữ liệu cho rễ ý mà
code ghi dữ liệu
Code:#include<stdio.h> //write.c #include<string.h> void main() { FILE *fp = fopen("d:\\data.db", "wb"); int i; struct bangdulieu { long thutu; // thư tự char madia[25]; // mã đĩa char duongdan[100]; // đường dẫn int kiemtra; // kiểm tra nếu: //bằng 1 (đúng) -> paste thành công //bằng 0 (sai) -> paste thất bại } nguon; strcpy(nguon.madia, "hdd1-copy-22-20-2011"); strcpy(nguon.duongdan, "C:.......folder"); nguon.kiemtra = 1; for (i =1; i<100000; i++) { nguon.thutu = i; fwrite(&nguon, sizeof(struct bangdulieu), 1, fp); } fclose(fp); }
code dọc dữ liệu
//read.c
code trên mình copy của bạn mình do mới học c được mấy ngày nên mình không biết sửa kiểu gìCode:#include<stdio.h> #include<string.h> void main() { struct bangdulieu { long thutu; char madia[25]; char duongdan[100]; int kiemtra; } nguon; FILE *fp = fopen("e:\\data.db", "rb"); int id; printf("id can xem : "); scanf("%d", &id); fseek(fp, id*sizeof(struct bangdulieu), SEEK_SET); fread(&nguon, sizeof(struct bangdulieu), 1, fp); fclose(fp); printf("thutu: %ld\n", nguon.thutu); printf("madia: %s\n", nguon.madia); printf("duongdan: %s\n", nguon.duongdan); printf("kiemtra: %d\n", nguon.kiemtra); }
madia, duongdan fix cứng làm tốn dung lượng quá nhiều khi đường dẫn chỉ 20 char mà nó lưu vào tận 100 char
Bạn nào dành về C có thể sửa hộ mình code trên làm sao cho nó chạy nhanh chút được không
Và giúp mình cách đánh chỉ mục luôn mình cần đánh chỉ mục trường thutu, và kiemtra
Để tiết kiệm dữ liệu, bạn có thể dùng cấp phát động cho "madia" và "đuongan", đây là demo:
C++ Code:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct bangdulieu { long thutu; char* madia; char* duongdan; bool kiemtra; }; void ghi_dia(FILE* fp, long thutu, const char *madia, const char *duongdan, bool kiemtra) { bangdulieu bdl; bdl.thutu = thutu; bdl.madia = (char*) malloc(strlen(madia) + 1); bdl.duongdan = (char*) malloc(strlen(duongdan) + 1); strcpy(bdl.madia, madia); strcpy(bdl.duongdan, duongdan); bdl.madia[strlen(madia)] = '\0'; bdl.duongdan[strlen(duongdan)] = '\0'; // write fwrite(&bdl, sizeof(bangdulieu), 1, fp); // close file fclose(fp); // release data free(bdl.madia); free(bdl.duongdan); } int main() { FILE *fp = fopen("data.txt", "wb"); ghi_dia(fp, 1, "12", "123", true); return 0; }
Để tăng tốc độ ghi thì phụ thuộc vào bạn ghi nó thế nào. Tốc độ chỉ ảnh hưởng khi bạn mở file quá nhiều lần thôi, tuy nhiên nếu dữ liệu lớn thì điều này không thể tránh khỏi. Bạn chỉ có cách ghi ra từng block và dùng một con trỏ để lưu index nó lại vào một bảng nào đó, bằng cách này bạn sẽ có thể truy xuất dữ liệu nhanh hơn. Dùng hashing cũng là một cách.
Mình đã test qua code của bạn, sỡ dĩ chương trình của bạn chậm là vì bạn gọi hàm read() và write() quá nhiều lần (cái for loop của bạn).
Cách duy nhất bạn có thể speed up là bạn phải pack chúng lại thành từng block, càng lớn càng tốt vì khi bạn đụng đến external disk, tốc độ xử lý sẽ cực kì chậm. Dù có bạn có load vài trăm MB vào main memory và xử lý thì vẫn nhanh hơn là bạn đọc vào từng MB và xử lý. Vì lý do đó, bạn phải tạo một cấu trúc dữ liệu sao đó để gom, ví dụ 1000 records và write một lần, đọc vào một lần cũng một 1000 records, lưu lại bằng hash table, thì việc truy xuất sẽ tăng đáng kể.
C++ Code:
#include <string.h> #include <windows.h> #include <iostream> struct huge { char data0[1024]; char data1[1024]; char data2[1024]; char data3[1024]; char data4[1024]; char data5[1024]; char data6[1024]; char data7[1024]; char data8[1024]; char data9[1024]; }; struct tiny { char data[1024]; }; int main() { LARGE_INTEGER start, end; // open file FILE* fp = fopen("data.txt", "wb"); tiny tiny_data; huge huge_data; QueryPerformanceCounter(&start); for (int i = 0; i < 10; ++i) { fwrite(&tiny_data, sizeof(tiny), 1, fp); } QueryPerformanceCounter(&end); QueryPerformanceCounter(&start); fwrite(&huge_data, sizeof(huge), 1, fp); QueryPerformanceCounter(&end); return 0; }
Thank bạn nhiều mình làm được rồi