当前位置: 首页 > 知识库问答 >
问题:

从文件读取数据到链表非常慢

孟振
2023-03-14

我有一个大问题,我自己创建了链表和数据结构,但数据读取功能工作非常慢。如果我尝试读取10k结构,函数需要大约530ms:

List size: 10000
Time: 530
Delete success
Press any key to continue . . .

但是当我尝试读取10倍大的数据量(100k)时,大约需要44500毫秒:

List size: 100000
Time: 44512
Delete success
Press any key to continue . . .

这是我的代码:

IQ_struct.h

#ifndef IQ_sturct_H
#define IQ_struct_H

class IQ_struct {
public:
    IQ_struct();
    void setIQ(float, float);
    float getIQ();
    float getIQx();
    float getIQy();
    ~IQ_struct();
private:
    float newX;
    float newY;
};

#endif

IQ_struct.cpp

#include "IQ_struct.h"

IQ_struct::IQ_struct(){
    newX = 0;
    newY = 0;
}

IQ_struct::~IQ_struct(){}

void IQ_struct::setIQ(float x, float y){
    newX = x;
    newY = y;
}

float IQ_struct::getIQx(){
    return newX;
}

float IQ_struct::getIQy(){
    return newY;
}

IQ_data.h

#include <string>
#include "IQ_struct.h";

#ifndef IQ_data_H
#define IQ_data_H

class IQ_data{

public:
    IQ_data();
    void AddData(float, float);
    void Begin();
    void Next();
    bool End();
    IQ_struct GetData();
    void ReadFromFile(std::string,int);
    int GetSize();
    ~IQ_data();


private:
    typedef struct TNode{
        IQ_struct data;
        TNode *next;
    }* nodePtr;

    nodePtr head;
    nodePtr curr;
    nodePtr temp;
    int size;
};

#endif

IQ_data.cpp

#include <cstdlib>
#include <string>
#include <iostream>
#include <fstream>
#include "IQ_data.h"

using namespace std;

IQ_data::IQ_data(){
    head = NULL;
    curr = NULL;
    temp = NULL;
    size = 0;
}

void IQ_data::AddData(float x, float y){
    nodePtr n = new TNode;
    n->next = NULL;
    n->data.setIQ(x,y);

    if(head != NULL){
        curr = head;
        while(curr->next != NULL){
            curr = curr->next;
        }
        curr->next = n;
    }else{
        head = n;
    }
}


void IQ_data::Begin(){
    curr = head;
}

void IQ_data::Next(){
    curr = curr->next;
}

bool IQ_data::End(){
    return curr == NULL;
}
IQ_struct IQ_data::GetData(){
    return curr->data;
}

void IQ_data::ReadFromFile(string fileName,int a){
    float x,y;
    fstream myfile(fileName, ios_base::in);
    for(int k = 0; k < a; k++){
        myfile >> x;
        myfile >> y;
        AddData(x,y);
        size = size + 1;
    }
    myfile.close();
}

int IQ_data::GetSize(){
    return size;
}

IQ_data::~IQ_data(){
    while (head != NULL){
        curr = head;
        head = head->next;
        delete curr;
    }
    delete temp;
    delete head;
    curr = NULL;
    delete curr;
    cout << "Delete success \n";
}

Main.cpp

#include <iostream>
#include <fstream>
#include <omp.h>
#include <time.h>
#include <cstdlib>
#include "IQ_data.h"

using namespace std;


int main(){
    IQ_data listas;
    clock_t init, fin;
    init = clock();
    listas.ReadFromFile("0.0013.txt",100000);
    fin = clock() - init;
    cout <<"List size: "<< listas.GetSize() << endl;
    cout <<"Time: "<<fin<<endl;
    return 0;
}

我做错了什么?主要问题是我的文件包含超过5000K的结构。提前感谢您的帮助:)

共有1个答案

刘松
2023-03-14

您要添加到列表的末尾,因此每次都需要遍历整个列表,随着列表变长,这需要更长的时间。

要么添加到列表的开头,要么保留一个指向最后一个元素的指针,以便可以快速插入。

 类似资料:
  • 问题内容: 我有一个包含一些元数据的文件,然后是包含2个带有标题的列的实际数据。在numpy中使用genfromtxt之前,是否需要将两种类型的数据分开?还是可以以某种方式拆分数据?将文件指针放在标题上方行的末尾,然后从那里尝试genfromtxt怎么办?谢谢该文件的格式如下所示: 问题答案: 如果您不希望第一行,请尝试(如果没有丢失的数据): 或(如果缺少数据): 如果然后要解析标头信息,则可以

  • 我创建了一个方法,根据文件中的行号从文件中读取特定行。它对大多数文件都很好,但当我试图读取一个包含大量非常长的行的文件时,它需要很长时间,特别是当它在文件中的位置越来越深时。我还做了一些调试,似乎也占用了大量内存,但我不确定这是否可以改进。我知道还有一些其他的问题集中在如何从文件中读取某些行,但这个问题主要集中在性能方面。 如何优化此方法以使其比光速更快?

  • 我正在尝试从com包中的CSV文件中读取值。实例但当我使用以下语法运行代码时: 上面写着: java.io.FileNotFoundException: Dataset.csv 我也尝试过使用: 仍然不工作。任何帮助都会很有帮助。谢谢

  • 我有一个非常简单的问题:使用Python从txt文件中读取不同条目的最有效方法是什么? 假设我有一个文本文件,如下所示: 在C中,我会这样做: 用Python做这样的事情最好的方法是什么?以便将每个值存储到不同的变量中(因为我必须在整个代码中使用这些变量)。 提前感谢!

  • 我正在尝试排序的键(优先数,int数)从最高到最低的链表,与数据从文本文件。我正在埋头插入项目并对它们进行排序。这是我的文本文件。 我的工作66 垃圾17 资金25 重要96 生命99 Moreutn 28 工作69 转让44 这是我的链表类 } 下面是我的节点类: 下面是我的数据类: 从链表类运行时的当前输出: 我的insert方法总是在第一个if语句处停止,而从不继续运行。我不知道怎么修好它。

  • 我有一个java代码,我在其中读取了一个txt文件,然后迭代它,以便我可以将其填充到2d数组中。在我读取文件后,我能够打印出其内容,因此我确信该文件已被读取。并且我还确信bufferedreader库的. hasNextLine方法在找到一行时显示为true。但是当我在time循环中使用它时,它就像没有找到任何行一样,因此它没有迭代,因为我不知道我在表中有多少行。== 此外,当我硬编码行数以便检查