Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Cách index theo id trong c (database mini project)

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    27

    Mặc định Cách index theo id trong c (database mini project)

    code chưa index trường id
    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 muốn index trường id vậy mình phải code như thế nào?

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    46

    Mình không hiểu ý bạn lắm, bạn đang giả lập database bằng C?

  3. #3
    Ngày gia nhập
    11 2011
    Bài viết
    27

    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]

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    46

    Bạn cho mình đoạn code bạn viết + dữ liệu được 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
    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?
    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)

  5. #5
    Ngày gia nhập
    11 2011
    Bài viết
    27

    Trích dẫn Nguyên bản được gửi bởi Halen Xem bài viết
    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?
    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à

    Trích dẫn Nguyên bản được gửi bởi Halen Xem bài viết
    Bạn cho mình đoạn code bạn viết + dữ liệu được không?


    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:
    #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);
    
    
    }
    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ì
    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

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    46

    Mặc định Cách index theo id trong c (database mini project)

    Để 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:
    1.  
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5.  
    6. struct bangdulieu {
    7.     long   thutu;
    8.     char*  madia;
    9.     char*  duongdan;
    10.     bool   kiemtra;
    11. };
    12.  
    13. void ghi_dia(FILE* fp, long thutu, const char *madia, const char *duongdan, bool kiemtra) {
    14.     bangdulieu bdl;
    15.     bdl.thutu = thutu;
    16.     bdl.madia = (char*) malloc(strlen(madia) + 1);
    17.     bdl.duongdan = (char*) malloc(strlen(duongdan) + 1);
    18.     strcpy(bdl.madia, madia);
    19.     strcpy(bdl.duongdan, duongdan);
    20.     bdl.madia[strlen(madia)] = '\0';
    21.     bdl.duongdan[strlen(duongdan)] = '\0';
    22.     // write
    23.     fwrite(&bdl, sizeof(bangdulieu), 1, fp);
    24.  
    25.     // close file
    26.     fclose(fp);
    27.     // release data
    28.     free(bdl.madia);
    29.     free(bdl.duongdan);
    30. }
    31.  
    32. int main() {
    33.     FILE *fp = fopen("data.txt", "wb");
    34.     ghi_dia(fp, 1, "12", "123", true);
    35.     return 0;
    36. }

    Để 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.

  7. #7
    Ngày gia nhập
    11 2011
    Bài viết
    27

    Trích dẫn Nguyên bản được gửi bởi Halen Xem bài viết
    Để 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:
    ..........................
    ..........................
    Để 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.
    Bạn ơi thế còn đọc giữ liệu ra thì sao bạn

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    46

    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:
    1. #include <string.h>
    2. #include <windows.h>
    3. #include <iostream>
    4.  
    5. struct huge {
    6.     char data0[1024];
    7.     char data1[1024];
    8.     char data2[1024];
    9.     char data3[1024];
    10.     char data4[1024];
    11.     char data5[1024];
    12.     char data6[1024];
    13.     char data7[1024];
    14.     char data8[1024];
    15.     char data9[1024];
    16. };
    17.  
    18. struct tiny {
    19.     char data[1024];
    20. };
    21.  
    22. int main() {
    23.     LARGE_INTEGER start, end;
    24.     // open file
    25.     FILE* fp = fopen("data.txt", "wb");
    26.  
    27.     tiny tiny_data;
    28.     huge huge_data;
    29.  
    30.     QueryPerformanceCounter(&start);
    31.     for (int i = 0; i < 10; ++i) {
    32.         fwrite(&tiny_data, sizeof(tiny), 1, fp);
    33.     }
    34.     QueryPerformanceCounter(&end);
    35.     std::cout << "Mutiple write() time elapsed: " << end.QuadPart - start.QuadPart << "ticks. \n";
    36.  
    37.     QueryPerformanceCounter(&start);
    38.     fwrite(&huge_data, sizeof(huge), 1, fp);
    39.     QueryPerformanceCounter(&end);
    40.     std::cout << "Single write() time elapsed: " << end.QuadPart - start.QuadPart << "ticks. \n";
    41.  
    42.     return 0;
    43. }

  9. #9
    Ngày gia nhập
    11 2011
    Bài viết
    27

    Thank bạn nhiều mình làm được rồi

Các đề tài tương tự

  1. Database Cách search text trong database theo ký tự không dấu?
    Gửi bởi lion080889 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 04-05-2013, 03:44 PM
  2. Làm sao để add Help vào project focus vào topic hoặc index
    Gửi bởi leminh_005 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 28-11-2011, 01:55 PM
  3. Làm sao tạo 1 project theo mô hình 3 lớp trong C#?
    Gửi bởi vernonpham89 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 16
    Bài viết cuối: 03-04-2011, 11:52 AM
  4. Tạo file setup trong C# có thể kèm theo Database không?
    Gửi bởi 5Luong trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 20-11-2010, 09:27 AM
  5. cách theo dõi user truy cập Database trong C# như thế nào?
    Gửi bởi minhduc0912 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 23-10-2009, 10:31 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn