我需要尽快加载一个包含5百万个数据的txt文件(即字符串,每个单词,每个单词9个字符,由新行分隔。)到QVector。代码现在正常工作,但是,如果用户点击上传,则应用程序需要3-5秒才能加载此数据以进行进一步操作。我需要减少加载这些数据的时间。处理这个问题的正确方法是什么?我很好用Qt / STL / Boost。我更喜欢Qt。我用于此任务的代码是Qt文档中建议的代码
<main>': undefined method `save_to_csv' for [["user1"], ["user2"], etc]
答案 0 :(得分:2)
您的示例代码实际上隐式地解码。它从文件中读取8位编码文本,并将其转换为QString
,内部使用16位Unicode编码。
如果不使用QTextStream
,您可能会直接使用普通QFile
,并使用此readLine
方法读取表单,并返回{{1换句话说,“原始”文件内容。这样做的目的是避免为整个文件内容创建QByteArray
个对象。
如果你有500万行,那么如果你将它们存储在QString
而不是QByteArray
的内存中,你也可以节省大量内存。仅当您实际要在GUI中显示文本时才转换为QString
。
注意:注意文本编码!任何文件中的任何文本都始终编码,即使特别讲英语的人可能没有意识到它。最简单的编码是7位ASCII,实际上很多纯英文文本都是这样,几乎每个包含UTF-8的编码实际上都是7位ASCII的超集,因此几乎任何编码都可以加载7位ASCII文件。但是对于多语言文本,您需要知道文件使用的编码,或者您将获得重音和其他特殊字符,例如ÄÅÁÀÃ,错误。 UTF8是唯一可以存储“所有内容”的编码,其他编码如Latin1是专为特定语言系列设计的。
注2:QString
实际上对应于QByteArray
用于大多数目的。 std::string
更像QString
。不是说这些是相同的1:1匹配,但它有助于将它们视为相似。
答案 1 :(得分:1)
试试这个:
我测试了它并在 2.1秒中读取文件。
我reserve
向量,然后阅读并使用QElapsedTimer
来获取阅读时间。
void MainWindow::readDataText()
{
QString filePath = "F:\\Qt\\Big_File\\Big_File\\data.txt";
QVector<qint64> *vector = new QVector<qint64>;
vector->reserve(5000000);
QElapsedTimer timer;
QFile readFile(filePath);
if(!readFile.open(QFile::ReadOnly | QFile::Text))
{
// Can't Open File.
}
else
{
QByteArray data;
timer.start();
for (int var = 0; var < 5000000; ++var)
{
vector->insert(var, (readFile.readLine()).toInt());
}
qint64 time = timer.elapsed();
ui->txtReadTimeText->setText(QString::number(time));
}
readFile.close();
}
如果您的文件是二进制文件,也会更好。
另一个解决方案是使用readAll()
函数并在 116毫秒中读取文件,然后像这样处理(由'\ n'分割)数据:
void MainWindow::readDataText()
{
QString filePath = "D:\\ProjectTest\\ProjectTest\\data.txt";
QByteArray data;
data.reserve(5000000);
QElapsedTimer timer;
QFile readFile(filePath);
if(!readFile.open(QFile::ReadOnly | QFile::Text))
{
// Can't Open File.
}
else
{
timer.start();
data = readFile.readAll();
qint64 time = timer.elapsed();
ui->txtReadTimeText->setText(QString::number(time));
}
readFile.close();
}