玩游戏的时候内存卡读写速度级别读写数据的大小

当spark读取一个非常大的本地文件时,读入内存后分区会自动分布到多个节点上吗?
本地文件指的是在某一个节点的本地文件系统上,不是HDFS上面。如若不然是在执行action的时候再拷贝相应分区到多个worker节点进行并行计算吗?希望能说一下对应哪块源码。我目前还没找到这一块。
按时间排序
那么针对这个问题是说在触发action的时候,是整个文件被copy到work节点,而不是复制文件的某个分区是这样的吗?
会自动分,和这个文件大小没关系
一·是在执行action的时候再拷贝相应分区到多个worker节点进行并行计算吗?不是,这种读取local file system而不是hdfs的情况,需要同一个文件存在所有的worker node上面,在读取的时候每个worker node的task会去读取本文件的一部分。打个比方,比如你有一个file,有一个spark集群(node1是master,node2,node3两个是slaves),那么这个file需要在node2,node3上面都存在,这两个节点的task会各读一半,不然会出错。(这里其实还有一个点注意,你的spark app所运行的节点也需要有这个file,因为需要用到file进行Partition划分)。二·具体对应哪一段源码。1.由读取文件的方法SparkContext.textFile(path)跟踪源码知道它利用了TextInputFormat生成了一个HadoopRDD.def textFile(
path: String,
minPartitions: Int = defaultMinPartitions): RDD[String] = withScope {
assertNotStopped()
hadoopFile(path, classOf[TextInputFormat], classOf[LongWritable], classOf[Text],
minPartitions).map(pair =& pair._2.toString)
def hadoopFile[K, V](
path: String,
inputFormatClass: Class[_ &: InputFormat[K, V]],
keyClass: Class[K],
valueClass: Class[V],
minPartitions: Int = defaultMinPartitions): RDD[(K, V)] = withScope {
assertNotStopped()
// A Hadoop configuration can be about 10 KB, which is pretty big, so broadcast it.
val confBroadcast = broadcast(new SerializableConfiguration(hadoopConfiguration))
val setInputPathsFunc = (jobConf: JobConf) =& FileInputFormat.setInputPaths(jobConf, path)
new HadoopRDD(
confBroadcast,
Some(setInputPathsFunc),
inputFormatClass,
valueClass,
minPartitions).setName(path)
2.再来分析HadoopRDD,对于你的疑问来说最重要的是getPartitions方法,也就是如何划分你输入的文件成为Partitions:override def getPartitions: Array[Partition] = {
val jobConf = getJobConf()
// add the credentials here as this can be called before SparkContext initialized
SparkHadoopUtil.get.addCredentials(jobConf)
val inputFormat = getInputFormat(jobConf)
if (inputFormat.isInstanceOf[Configurable]) {
inputFormat.asInstanceOf[Configurable].setConf(jobConf)
val inputSplits = inputFormat.getSplits(jobConf, minPartitions)
val array = new Array[Partition](inputSplits.size)
for (i &- 0 until inputSplits.size) {
array(i) = new HadoopPartition(id, i, inputSplits(i))
其中 val inputSplits = inputFormat.getSplits(jobConf, minPartitions), 是将你的输入文件划分为多个Split,一个Split对应一个Partition,因为是本地文件系统,通过"file://"前缀可以获取文件系统,这个源码我就不帖了,这里minPartitions是2(如果你没有指定的话),也就是将file划分为2部分,每个Split都有SplitLocationInfo描述该Split在哪个node上如何存储,比如FileSplit包含了(Hosts,start, len, path),就是在哪个host上面的哪个path,从哪个起点start读取len这么多数据就是这个Split的内容了。对于本地文件,他的Host直接指定的是localhost,path就是你传入的文件路径,start和len根据2份进行简单的计算即可,我就不赘述。有了这个信息我们可以构造每个Split的PreferLocation:override def getPreferredLocations(split: Partition): Seq[String] = {
val hsplit = split.asInstanceOf[HadoopPartition].inputSplit.value
val locs: Option[Seq[String]] = HadoopRDD.SPLIT_INFO_REFLECTIONS match {
case Some(c) =&
val lsplit = c.inputSplitWithLocationInfo.cast(hsplit)
val infos = c.getLocationInfo.invoke(lsplit).asInstanceOf[Array[AnyRef]]
Some(HadoopRDD.convertSplitLocationInfo(infos))
case e: Exception =&
logDebug("Failed to use InputSplitWithLocations.", e)
case None =& None
locs.getOrElse(hsplit.getLocations.filter(_ != "localhost"))
从这段代码可以看出来,对于localhost的host,是没有PreferredLocation的,这个会把对应于该partition的task追加到no_prefs的任务队列中,进行相应data locality的任务调度。3.任务调度val taskIdToLocations = try {
stage match {
case s: ShuffleMapStage =&
partitionsToCompute.map { id =& (id, getPreferredLocs(stage.rdd, id))}.toMap
case s: ResultStage =&
val job = s.resultOfJob.get
partitionsToCompute.map { id =&
val p = job.partitions(id)
(id, getPreferredLocs(stage.rdd, p))
由于Spark每个partition的运算都是由一个task进行的,那么partition的preferlocation会成为task的preferLocation,这是data locality的任务调度,遵循着移动计算比移动数据更加高效的原则。那么这样每个task都有了自己的应该允许的Location,然而对于本地文件系统,这是一个坑爹的存在,因为getPreferredLocs这个方法返回的是Nil,是空的。如果task没有PreferLocation,那么它如何被调度呢?答案在TaskSetManager里面:if (tasks(index).preferredLocations == Nil) {
addTo(pendingTasksWithNoPrefs)
如何没有preferLocation的话,那么是会把这个任务追加到pendingTasksWithNoPrefs数组里面。该数组里面的任务是以Round-Robin的方式分发到各个Executor里面的,到这里已经能说明问题了,你有一个file,根据FileInputFormat生成了两个Split,HadoopRDD据此生成了两个Partition,两个Partition需要两个Task,这两个Task会 Round-Robin 得spread到你的node2,node3上面的executor上面,这些Task要读取的Split的文件的host都是localhost,大小就是file的一半,到此,你应该可以理解为什么需要这个file在每个worker node都存在了,因为每个worker node的executor执行的task要读取的Split的Location信息是localhost,他不会到master上面读,只会在运行这个task的worker node本地读。相对应的源码就是上面的,细节留待你自己去再梳理一遍。PS:1.这种使用textFile方法读取本地文件系统的文件的方法,只能用于debug,不用于其他任何用途,因为他会导致file的replication数与node的个数同步增长。2.上述描述中的分成2份这种是默认值,为了方面说明,你可以自己设置partition个数。
如果你的文件是保存在hdfs上的,且文件是可切分的,加载以后的rdd的分区就会跟这个文件在hdfs的partition个数一样
错spark每个worker会读取本地路径下的文件的某一段不存在复制文件内容的过程你要保证这些文件内容一样
已有帐号?
无法登录?
社交帐号登录玩游戏时,虚拟内存很小,要怎么调整?_百度知道
玩游戏时,虚拟内存很小,要怎么调整?
常规显示是480M,虚拟似乎是720M
我有更好的答案
Windows虚拟内存不足的几种解决方法问:
经常听别人说起虚拟内存,请问什么是虚拟内存?为什么我的电脑在使用过一段时间后,总是提示虚拟内存太低,是不是只有重新安装操作系统才能解决问题?
答:Windows操作系统用虚拟内存来动态管理运行时的交换文件。为了提供比实际物理内存还多的内存容量以供使用,Windows操作系统占用了硬盘上的一部分空间作为虚拟内存。当CPU有需求时,首先会读取内存中的资料。当所运行的程序容量超过内存容量时,Windows操作系统会将需要暂时储存的数据写入硬盘。所以,计算机的内存大小等于实际物理内存容量加上“分页文件”(就是交换文件)的大小。如果需要的话,“分页文件”会动用硬盘上所有可以使用的空间。
如果你的系统虚拟内存太低,可以鼠标右击“我的电脑”选择...
因为你的C盘剩余空间太小了,打开大程序物理内存用完了,就要在硬盘上虚拟,不过速度要比物理的慢的多
虚拟内存设为默认的就行了,由系统管理就好,更改了不要认为会提升你的速度,只乎为零,反而会占用你的空间,只要你的你的系统盘留够充足的剩余空间就行了
如果非要设,你就设成物理内存的1.5倍
出现虚拟内存不够,一会为你启动程序太多或病毒,或你的系统盘剩余空间太小
1.在开始菜单运行中输入msconfig回车,在启动里将所有(除ctfmon)对勾都去掉保存重启动试试(也可以加快启动速度),一般是你启动运行程度太多,或文件冲突问题
安装360安全卫士,开机一直按F8进入安全模式查杀,现在网上十个毒有九个是木马,所以杀毒软件都查不到毒,建议安装360查杀
虚拟内存不足一般为没有剩余空间和病毒,不信...
对于虚拟内存文件,Windows XP为了安全默认值总是设的很大,浪费了不少的硬盘空间,其实我们完全可以将它的值设小一点。方法是:进入“控制面板/系统/高级/性能/设置/高级/虚拟内存/更改”,来到虚拟内存设置窗口,首先确定你的页面文件在哪个驱动器盘符,然后将别的盘符驱动器的页面文件全部禁用。建议你把它是设置到其他分区上,而不是默认的系统所在的分区,这样可以提高页面文件的读写速度,有利于系统的快速运行。根据微软的建议,页面文件应设为内存容量的1.5倍,但如果你的内存比较大,那它占用的空间也是很可观的,所以,建议如果内存容量在256MB以下,就设置为1.5倍,最大值和最小值一样,如果在512MB以上,设置为内存容量的一半完全可行。
把硬盘 显卡 换好的
其他类似问题
为您推荐:
虚拟内存的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁> 合理配置MySQL缓存提高缓存命中率众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几
合理配置MySQL缓存提高缓存命中率众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几
wuhandai & &
发布时间: & &
浏览:57 & &
回复:0 & &
悬赏:0.0希赛币
合理配置MySQL缓存 提高缓存命中率
众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍。故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率。MySQL数据库也不例外。在这里,笔者将结合自己的工作经验,跟大家探讨一下,MySQL数据库中缓存的管理技巧:如何合理配置MySQL数据库缓存,提高缓存命中率。一、什么时候应用系统会从缓存中获取数据   数据库从服务器上读取数据时,可以从硬盘的数据文件中获取数据,也可以从数据库缓存中读取数据。现在数据库管理员需要搞清楚的是,在什么样的情况下,系统是从缓存中读取数据,而不是从硬盘的数据文件中读取数据   简单的说,数据缓存就是内存中的一块存储区域,其存储了用户的SQL文本以及相关的查询结果。通常情况下,用户下次查询时,如果所使用的SQL文本是相同的,并且自从上次查询后,相关的纪录没有被更新过,此时数据库就直接采用缓存中的内容。从这个原则中,可以看到如果要直接使用缓存中的数据,至少要满足以下几个条件。  一是所采用的SQL文本是相同的。当前后两次用户使用了相同的SQL语句(假设不考虑其他条件),则服务器会从缓存中读取结果,而不需要再去解析和执行SQL语句。这里需要注意的是,这里的SQL文本必须一次不差的完全相同。如果前后两次查询,使用了不同的查询条件。如第一次查询时没有输入Where条件语句。后来发现数据量过多,利用了Where条件了过滤查询的结果。此时即使最后的查询结果是相同的,系统仍然是从数据文件中获取数据,而不是从数据缓存中。再如,Select后面所使用的字段名称也必须是相同的。如果有一个字段名称不同或者前后两次查询所使用的字段数量不同,则系统都会认为是不同的SQL语句,而重新解析并查询。  二是从数据缓存的角度考虑,大小写是不敏感的。如前后两次查询时,采用的字段名称可能只有大小写的差异。如第一次使用的是大小,第二次使用的是小写,这系统认为仍然是相同的SQL语句。或者说关键字大小写等等这都是不敏感的。  三是要满足二次查询之间,数据记录包括表结构都没有被更改过。如果记录所在的标更改了,如增加了一个字段等等,此时使用这个表的所有缓冲数据系统将自动清空。这里需要注意,这里指的更改是一个广义的更改,包括表中任何数据或者结果的改变。举一个简单的例子,第一次查询时用户需要查询2010年的出货数据。查询后有用户在这个表中插入了一条2011年1月份的出货信息。然后又有用户需要查询2010年的出货信息。使用的SQL语句与第一次查询时完全相同。在这种情况下,数据库系统会使用缓存中的数据吗 答案是否定的。因为当中间用户插入一条记录时,系统会自动清空跟这个表相关的所有缓存记录。当第二次查询时,缓存中已经没有这张表对应的缓存信息。此时就需要重新解析并查询。  四是需要注意,默认字符集对缓存命中率的影响。通常情况下,如果客户端与服务器之间所采用的默认字符集不同,则即使查询语句相同、在两次查询之间记录与表结构也没有被更改,系统仍然认为是不同的查询。对于这一点需要特别的注意,大家比较容易忽视。  二、提高缓存命中率的建议。  从上面的条件分析中可以看出,利用缓存中的数据具有比较严格的条件。其实这些条件也是合情合理的。主要是为了保障数据的一致性。对以上这些条件有深入的认识之后,现在数据库管理员需要考虑的是,如何来提高这个缓存的命中率 对此笔者有如下几个建议。  一是在配置时,客户端与服务器端要使用相同的字符集。如果客户端(或者说第三方工具)与服务器端使用的字符集不同,那么任何情况下都不会使用缓存功能。特别在国内,需要用到中文的字符集。此时特别需要注意,客户端默认字符集要与服务器端的默认字符集相同。注意,这里是相同,而不是兼容。有时候即使采用了不同的字符集,客户端上仍然可以正常显示。这主要是因为有些字符集虽然不相同,但是是相互兼容的。在缓存管理上,需要相同,光兼容还不行。  二是在客户端上,要固化查询的语句。如现在有财务人员和采购人员同时从系统中查询11月份的出货数据。显然他们岗位职责不同,所需要字段的内容是不同的。此时在客户端出,可以允许用户设置自己所需要的表单格式。但是笔者建议,后台所采用的SQL语句最好是相同的。这里数据会经过三个渠道:后台数据库、客户端、用户。笔者的意识时,后台数据库与客户端之间的交互采用相同的SQL语句。然后客户端与用户之间进行交互时,根据用户定义的格式(包括字段前后的排列、不包括查询条件语句的差异)向用户显示数据。此时由于采用了相同的SQL语句(只是用户对于显示格式的要求不同),从而可以提高应用系统的查询效率。  三是提高内存中缓存的配置,来提高命中率。一般在服务器启动时,操作系统会跟数据库软件协商缓存空间的大小。当缓存工作不足时,缓存中最旧的缓存记录会被最新的消息所覆盖。可见,如果能够提高缓存空间,就可以提高命中率。这就好像打靶,目标多了,命中的几率也会高许多。不过用户的并发数越多,这个设置的效果会越不明显。  四是通过分区表可以提高缓存的命中率。在上面的条件分析中,大家可以看到,只要所查询的表中插入了一条记录,系统就会清空缓存记录。现在以查询出货记录为例。出货记录表每天都在更新,而用户在年初时,会经常需要查询上一年的出货记录。此时由于这个表中的数据每个小时都在更新,那么缓存中的信息会不断的被情况。此时缓存的命中率显然不会很高。针对这种情况,笔者建议可以采用分区表。如可以通过系统设置,将2010年的出货记录单独存放在一个出货的分区表中。即每一个年度都使用一张单独的分区表。此时2011年的纪录,就不会影响到2010年的分区表。此时如果用户重复查询2010年的出货信息,只要其使用的SQL语句相同(没有采用不同的查询条件),那么就可以享受缓存机制所带来的效益,提高应用系统的查询效果。。  三、多个应用对缓存的影响。  通常情况下,MySQL数据库的缓存是根据服务器内存的大小自动分配的。如果一台服务器上只有一个MySQL应用,那么固然最好。不过在实际工作中,为了降低信息化投资的成本,往往会在同一台服务器上布置多个信息化应用。由于其他信息化应用也需要使用内存的空间作为缓存,那么MySQL数据库中缓存空间就可能变小。如果遇到这种情况下,数据库管理员需要跟系统工程师进行协商,为各种不同的应用根据性能要求的不同,手工设置不同的缓存空间。如此的话,就可以避免同一台服务器上不同信息化应用对缓存的冲突。
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&我想把我的笔记本加个4G的内存条,玩游戏速度会快吗_百度知道
我想把我的笔记本加个4G的内存条,玩游戏速度会快吗
配置14英寸 CPU型号 Intel 酷睿i3 2330MCPU主频 2.2GHz内存容量 2GB DDR3硬盘容量 500GB 5400转显卡芯片 NVIDIA GeForce GT 520M操作系统 预装Windows 7 Home Basic 64bit(64位家庭普通版)(家庭普通版)
提问者采纳
如果内存容量远远高出实际需求的时候,瓶颈效应很明显再加内存条之前,硬盘的数据读写速度比起内存来说太缓慢了,再去弄一根笔记本专用的 DDR3-1600 2G 或4G 的内存。因为在内存容量已经足够的情况下,中间有 PF使用率,新品价在149元 &#47,真正对系统运行速度有直接影响的 还是CPU。毕竟内存只是一个用来存放临时数据的地方,达到95%以上的话,建议你先做一下这个工作。但是,金士顿 威刚 都可以考虑,运行速度就只能依靠CPU了,内存只有在不够用的情况下; 249元以上,系统才会将一部分的程序寄存到硬盘的虚拟内存中去,内存容量可以增加到4G 或 6G ,基本就是卡机了:在玩游戏的时候,它高达90%以上,所以会一卡一卡的。【回答补充】看到你的配置图了,继续增加内存容量不会对系统运行速度的提升有任何的帮助,兼容性好 质量可靠,否则再加内存就没有意义了,那么就表示内存不够用了,假如玩游戏 或 看视频 浏览网页 的时候,2G内才能确实不够用了,你可以查看一下“任务管理器”的“性能”这一栏,这个情况下 才需要添加内存容量,这个就是内存利用率
那加了4G的玩剑灵之类的速度会快点吗
速度不保证会提升有多快,但是可以做到避免在加载游戏时就不卡机, 笔记本i3-2330M处理器的性能也就是台式机 赛扬G1610的水平,再配合GT520M 独显,以及4G内存,玩剑灵只能做到比较流畅的 开1档,2就会卡的很。你看一下这张剑灵的配置要求图就明白了。2G内存升为 4G 或6G 只是让你加载游戏时顺畅一些,玩游戏 卡不卡,还是得看CPU和显卡。
我不追求几档几档的,只希望加载的时候和玩的时候速度能快点
你这个配置,加一条内存多少可以提升一下加载游戏时的速度,毕竟你这个电脑现在只有2G内存 ,而Win 7系统 不管是32位
还是64位版本的,开机满载后,光系统就要占用1.3G左右的内存容量,2.0
还剩余 0.7G 的内存空间,这个太少了,仅仅开几个QQ账号就占满了,或者同时打开十几个网页 ,同样会出现内存利用率超负荷的状况,所以必须加内存。至于加2G 还是 4G 内存,这个看你自己的预算和心理预期啦。
来自团队:
其他类似问题
为您推荐:
其他3条回答
玩游戏顺畅的程度还是要看你整体的配置内存只是单一对的条件。我看了下你的配置。你加4G的 会有所提升
CPU在工作即处理问题时要从硬盘调用数据存放在内存条内,然后再从内存中读取数据供自己使用,简单的说内存是电脑的一个缓冲区,内存加大,也意味着缓冲区暂时存储的数据可以很多,对运行游戏速度提高是有一定的帮助,但我个人认为,CPU的处理数据能力才是最重要的决定因素。
一般来说会快点。主要是看你以前玩游戏时2g使用率。我电脑以前2g内存 玩游戏时内存使用90%。加了根2g内存条好很多。如果以前内存使用率只有60%-70% 加根4g内存条就感觉不到什么变化
内存条的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 内存卡读写速度 的文章

 

随机推荐