现在需要处理一个9万行,每行2001个浮点数的txt文件,大小约为3G。
需要进行的处理是:对每一行的后2000个数字进行从大到小排序。
我现在用的办法是:用ifstream进行读取,读出一行后存在一个vector<float>中,然后用快速排序进行处理。然后再读一行,再处理。但是我这样完成全部9万行的排序需要大约1到2分钟。
因为我的整个流程中需要执行约30万次的排序操作,每次会有一个在程序中生成的不同的2000维的浮点数向量,然后9万*2000的矩阵的每一列乘以对应的2000维向量中的一个数然后再分别每一行进行排序。
假如按照我之前的方法,每次读入一行,然后再乘以2000维向量对应的数后再排序,那么30万次需要的时间太长了。
我想向大家请教一下,我整个流程中最耗时的是不是读取文件的IO操作?我应该如何改善呢?
23 个解决方案
#1
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
#2
不是,每行第一个数字是另外的用途,比如第一个数子是500.0,那么我需要找到原始顺序中第500个数在排序完成后的序列中的位置。
不用写回原文件,我只需要排序来得到一些结果就行了。
#3
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
#4
3G的文件是可以一次性读入的,但在Win32下不行
#5
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
#6
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
#7
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
#8
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
你怎么算的,不是才3G的文件吗
#9
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
你怎么算的,不是才3G的文件吗
txt文件是3G,但是读进数组里的话,如果一个浮点数算4B,那一共有(90000*2001*4)/(1024*1024)=600多 G,是不是不应该这么算?
#10
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
#11
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
#12
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
我没具体的数据不好说,你可以分别测试下读入时间和排序时间
#13
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
我没具体的数据不好说,你可以分别测试下读入时间和排序时间
在排序这块,我是在vector内使用的快速排序,请问这里可以使用什么方法改进一下时间吗?
#14
一般情况下,首先快排,似乎没有更快的了……
#15
一般情况下,首先快排,似乎没有更快的了……
好的,谢谢您,有问题的话再向您请教
#16
为什么不放数据库里面加索引呢?
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
#17
mmap,数据库确实是最优选择
#18
为什么不放数据库里面加索引呢?
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
请问这里指的元素就是数据库中的一行吗?为什么这种情况下用数据库最好呢?
#19
这种事情,交给数据库去做是最合理的。
也许不是最快,但是够快。关键是够可靠。
就说你考虑下断电保护,你自己写代码就别玩了。
也许不是最快,但是够快。关键是够可靠。
就说你考虑下断电保护,你自己写代码就别玩了。
#20
不用文件,3g 数据直接放在内存里就行了。
另外,如果向量总是右乘矩阵,把矩阵按照列主元格式放在内存里。
还有,最好先实测一下,到底慢在哪里了。
另外,如果向量总是右乘矩阵,把矩阵按照列主元格式放在内存里。
还有,最好先实测一下,到底慢在哪里了。
#22
https://passport.csdn.net/account/login?username=z13975112990&activeCode=e3cfbb2da10056037aa96cdeaa9f9551&service=https://passport.csdn.net/account/register?action=userInfoView
#23
感觉好难哦........................................
#1
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
#2
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
不是,每行第一个数字是另外的用途,比如第一个数子是500.0,那么我需要找到原始顺序中第500个数在排序完成后的序列中的位置。
不用写回原文件,我只需要排序来得到一些结果就行了。
#3
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
#4
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
#5
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
#6
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
#7
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
#8
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
你怎么算的,不是才3G的文件吗
#9
每一行的第一个数字是行号吗?每行排序后,需要写回原文件吗?
我想能不能一次性都读进内存,这样读一次就够了,但是我算了一下好像太大了,没办法读进来。
3G的文件是可以一次性读入的,但在Win32下不行
我按一个float 4个字节算,9万行*每行2001个,这样算下来内寸肯定放不下,用什么方法可以读入呢?
只要你的电脑内存足够就行,vs下x64,可以申请足够内存
我计算了一下,需要600多G的内存,这个是不是太大了
你怎么算的,不是才3G的文件吗
txt文件是3G,但是读进数组里的话,如果一个浮点数算4B,那一共有(90000*2001*4)/(1024*1024)=600多 G,是不是不应该这么算?
#10
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
#11
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
#12
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
我没具体的数据不好说,你可以分别测试下读入时间和排序时间
#13
90000*2001*4=720360000 Byte
720360000/1024=703476.5625 KB
703476.5625 /1024=686.988830 MB
不好意思搞错了
多谢您的指正,我还有一个问题,就是像我这样的流程,最花费时间的过程是不是IO的过程呢?
我没具体的数据不好说,你可以分别测试下读入时间和排序时间
在排序这块,我是在vector内使用的快速排序,请问这里可以使用什么方法改进一下时间吗?
#14
一般情况下,首先快排,似乎没有更快的了……
#15
一般情况下,首先快排,似乎没有更快的了……
好的,谢谢您,有问题的话再向您请教
#16
为什么不放数据库里面加索引呢?
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
#17
mmap,数据库确实是最优选择
#18
为什么不放数据库里面加索引呢?
<1000个元素,冒泡排序
<100000个元素,qsort函数
<10000000个元素,放数据库中,建索引,(B+树排序)
≥10000000个元素,没用到过。
请问这里指的元素就是数据库中的一行吗?为什么这种情况下用数据库最好呢?
#19
这种事情,交给数据库去做是最合理的。
也许不是最快,但是够快。关键是够可靠。
就说你考虑下断电保护,你自己写代码就别玩了。
也许不是最快,但是够快。关键是够可靠。
就说你考虑下断电保护,你自己写代码就别玩了。
#20
不用文件,3g 数据直接放在内存里就行了。
另外,如果向量总是右乘矩阵,把矩阵按照列主元格式放在内存里。
还有,最好先实测一下,到底慢在哪里了。
另外,如果向量总是右乘矩阵,把矩阵按照列主元格式放在内存里。
还有,最好先实测一下,到底慢在哪里了。
#21
#22
https://passport.csdn.net/account/login?username=z13975112990&activeCode=e3cfbb2da10056037aa96cdeaa9f9551&service=https://passport.csdn.net/account/register?action=userInfoView
#23
感觉好难哦........................................