如何高效地从C文件检索数据

如何高效地从C文件检索数据,c,performance,file-io,C,Performance,File Io,我有一个程序,应该从文本文件中检索(启动时)数据。这个文件可能会变得很大,我想知道如何加快这个过程并评估它当前的性能。 用于检索数据的代码如下所示: void startUpBillsLoading(Bill *Bills) { FILE *BillsDb = 0, *WorkersDb = 0, *PaymentDb = 0; BillsDb = fopen("data/bills.db", "r"); WorkersDb = fopen("data/workers.d

我有一个程序,应该从文本文件中检索(启动时)数据。这个文件可能会变得很大,我想知道如何加快这个过程并评估它当前的性能。 用于检索数据的代码如下所示:

void startUpBillsLoading(Bill *Bills)
{
    FILE *BillsDb = 0, *WorkersDb = 0, *PaymentDb = 0;
    BillsDb = fopen("data/bills.db", "r");
    WorkersDb = fopen("data/workers.db", "r");
    PaymentDb = fopen ("data/payments.db", "r");
    char *Buffer = malloc (512);

    if (BillsDb && WorkersDb && PaymentsDb)
    {
        int i = 0, j = 0;

        while (fscanf (BillsDb, "%d;%[^;];%[^;];%[^;];%[^;];%d/%d/%d;%d/%d/%d;%d;%f;%f\n",
                &Bills[i].Id,
                Bills[i].CompanyName,
                Bills[i].ClientName,
                Bills[i].DepartureAddress,
                Bills[i].ShippingAddress,
                &Bills[i].Creation.Day,
                &Bills[i].Creation.Month,
                &Bills[i].Creation.Year,
                &Bills[i].Payment.Day,
                &Bills[i].Payment.Month,
                &Bills[i].Payment.Year,
                &Bills[i].NumWorkers,
                &Bills[i].TotalHT,
                &Bills[i].Charges) == 14)
        {
            Bills[i].Workers = 
                malloc (sizeof(Employee)*Bills[i].NumWorkers);

            fscanf (PaymentDb, "%d;%d;%[^;];%[^;];%[^\n]\n",
                    &Bills[i].Id,
                    &Bills[i].PaymentDetails.Method,
                    Bills[i].PaymentDetails.CheckNumber,
                    Bills[i].PaymentDetails.VirementNumber,
                    Bills[i].PaymentDetails.BankName);

            LatestBillId++;
            i++;
        }

        i = 0;
        while (fscanf (WorkersDb, "%d;%[^;];%[^;];%f\n",
                    &Bills[i].Id,   
                    Bills[i].Workers[j].Surname,
                    Bills[i].Workers[j].Name,
                    &Bills[i].Workers[j].Salary) == 4)
        {
            for (int j = 1; j <= Bills[i].NumWorkers-1; j++)
            {
                fscanf (WorkersDb, "%d;%[^;];%[^;];%f\n",
                                &Bills[i].Id,   
                                Bills[i].Workers[j].Surname,
                                Bills[i].Workers[j].Name,
                                &Bills[i].Workers[j].Salary);
            }
            i++;
        }

        fclose(BillsDb);
        fclose(WorkersDb);
        fclose(PaymentDb);
    }
    else
        printf ("\t\t\tImpossible d'acceder aux factures !\n");

    free (Buffer);
}
作废启动账单加载(账单*账单)
{
文件*BillsDb=0,*WorkersDb=0,*PaymentDb=0;
BillsDb=fopen(“数据/bills.db”,“r”);
WorkersDb=fopen(“data/workers.db”,“r”);
PaymentDb=fopen(“data/payments.db”,“r”);
char*Buffer=malloc(512);
if(账单和工人账单和付款账单)
{
int i=0,j=0;
而(fscanf(BillsDb),"%d ;%[^;];%[^;];%[^;];%[^;];%[^;];%d/%d/%d;%d/%d;%f;%f\n",
&法案[i].Id,
比尔[i].公司名称,
Bills[i].客户名称,
法案[i].部门地址,
法案[i].发货地址,
&比尔[i].Creation.Day,
&票据[i].Creation.Month,
&Bills[i].Creation.Year,
&票据[i].Payment.Day,
&票据[i].Payment.Month,
&票据[i].Payment.Year,
&比尔[i].女职工,
&法案[i].总计,
&账单[i].费用)==14)
{
法案[i]。工人=
malloc(员工人数)*账单[i].员工人数;
fscanf(PaymentDb,“%d;%d;%[^;];%[^;];%[^\n]\n”,
&法案[i].Id,
&票据[i].PaymentDetails.Method,
账单[i].PaymentDetails.CheckNumber,
账单[i].PaymentDetails.VirementNumber,
票据[i]。付款明细。银行名称);
最新的BillID++;
i++;
}
i=0;
而(fscanf(WorkersDb,“%d;%[^;];%[^;];%f\n”,
&法案[i].Id,
比尔[i].工人[j].姓,
比尔[i].工人[j].姓名,
&账单[i].工人[j].工资)==4)
{

对于(int j=1;j您必须阅读的内容很少。首先是渐近时间复杂度和渐近空间复杂度,第二个是大O表示法。大O表示法告诉您程序的运行情况。对于您提供的代码,大O表示法是O(n^2)aprox。因此,最大限制很好,因为它与快速排序相同,但由于您使用的数据具有很长的长度,因此加载时间将始终添加到您的运行时中。如果您想改进,请尽量减少数据的长度,并从文件中读取最少的数据。因为如果n值增加,时间将快速增加。您可以n阅读并从这里开始

只是一个旁注,按顺序读取文件速度更快。也许这对我很有用,因为它很好。如果以后必须处理较大的文件,您可能希望在启动时只加载一部分,如果真的需要加载其余部分(mayne异步?)但是,使用sql数据库可能更有效。如果性能很重要,为什么不使用实际的数据库,例如sqlite3?!@Lovy我刚刚想到了一个替代方案,就是让线程在后台加载数据,这样用户就不会出现这种“无响应”的情况数据加载时的时间,但是我不确定这是否真的有必要。它可能会更快,您可以尝试检查它是否更快。我不能确定,因为我不知道您的代码到底做什么。