我在Linux 64位(Redhat Enterprise)中有一个进程,它将100万条记录注册到内存中,每条记录为4KB,因此总内存消耗约为4千兆字节。
我的电脑有2GB的RAM和3 GB的交换内存。显然,部分数据将被放入交换内存中。问题是我不知道为什么遍历所有这些记录真的需要太长时间。我有一个循环遍历每个记录并执行一些操作的函数。它适用于大约500,000条记录,该功能只需要几分钟即可完成。但是,如果有两倍的记录,即1,000,000条记录,则需要数小时才能完成相同的功能。我在Linux中使用top命令来检查cpu负载,并看到它大约是90%wa(等待I / O的时间)。我想这可能会导致问题,但实际上不知道为什么会发生。
我非常感谢你们任何有用的想法。
答案 0 :(得分:3)
交换区域是磁盘。磁盘带宽比内存带宽小两到三个数量级。
答案 1 :(得分:3)
有两种选择:
答案 2 :(得分:1)
如果要有效地使用交换空间,则应确保在连续的内存块中按顺序遍历数据。即几兆字节的块。这样,当一个新的块从交换空间加载到ram中时,这个块也将包含接下来的几个记录。
答案 3 :(得分:1)
听起来像是缓存或交换颠簸正在发生。检查vmstat
进行验证。如果只加载尽可能多的数据到内存,处理它们,加载另一个块等等,您可以补救交换抖动。这样您就不必强加处理顺序(随机或顺序无关紧要)。或者,我们必须有更多关于您的算法/程序架构的详细信息才能发表评论。
答案 4 :(得分:1)
交换内存的速度取决于交换所在的底层硬件的速度。
通常在操作系统中,Windows将其称为pagefile.sys,Linux称之为交换分区,交换的硬件是系统中的硬盘驱动器之一,因此它比数据量慢几个数量级。 RAM。
答案 5 :(得分:0)
在购买更多内存之前,您可以尝试将部分内存用作压缩交换。我听说compcache,但我自己没有用过它。这个想法如下:
我很想知道它是否会提高你可以处理的记录数量而不会发生颠簸。