我通过Python的webdriver lib使用PhantomJS.它占用了大量的RAM和CPU,这是一个问题,因为我想运行尽可能多的实例.
一些谷歌没有给我任何帮助.所以我会直接问:
尺寸重要吗?如果我设置driver.set_window_size(1280,1024),它会占用比1024x768更多的内存吗?
源代码中是否有任何选项可以在没有实际问题的情况下关闭,从而导致显着的内存使用量减少?是的我仍然需要图像和CSS和JS加载和应用,但我可以摆脱一些其他功能...例如,我可以关闭缓存(并每次加载所有媒体文件).是的,我确实需要加快速度并减少它的贪婪,我准备重新编译它......这里有什么想法吗?
非常感谢!
我们有一个非常标准的Scrapy项目(Scrapy 0.24).
我想捕获特定的HTTP响应代码,例如200,500,502,503,504等.
像这样的东西:
class Spider(...):
def parse(...):
processes HTTP 200
def parse_500(...):
processes HTTP 500 errors
def parse_502(...):
processes HTTP 502 errors
...
Run Code Online (Sandbox Code Playgroud)
我们怎么做?
在Python中,逐行读取大文本文件很简单:
for line in open('somefile', 'r'): ...
Run Code Online (Sandbox Code Playgroud)
但是如何读取二进制文件并通过某个给定的标记"分割"(通过生成器)其内容,而不是换行符'\n'?
我想要这样的东西:
content = open('somefile', 'r').read()
result = content.split('some_marker')
Run Code Online (Sandbox Code Playgroud)
但是,当然,内存效率高(文件大约70GB).当然,我们无法通过每个字节读取文件(由于HDD的性质,它会太慢).
"块"长度(这些标记之间的数据)可能不同,理论上从1字节到兆字节.
因此,举一个例子来总结,数据看起来像那样(这里的数字是指字节,数据是二进制格式):
12345223-MARKER-3492-MARKER-34834983428623762374632784-MARKER-888-MARKER-...
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法可以做到这一点(没有实现大块读取,拆分块,记住尾巴等)?
我有一个mapper方法:
def mapper(value):
...
for key, value in some_list:
yield key, value
Run Code Online (Sandbox Code Playgroud)
实际上,我需要的是与普通的wordcount示例相差不远.我已经有了工作脚本,但只有当mapper方法看起来像这样:
def mapper(value):
...
return key, value
Run Code Online (Sandbox Code Playgroud)
这就是它的调用方式:
sc.textFile(sys.argv[2], 1).map(mapper).reduceByKey(reducer).collect()
Run Code Online (Sandbox Code Playgroud)
我花了2个小时尝试编写支持mapper生成器的代码.但不能这样做.我甚至同意只返回一份清单:
def mapper(value):
...
result_list = []
for key, value in some_list:
result_list.append( key, value )
return result_list
Run Code Online (Sandbox Code Playgroud)
在这里:https://groups.google.com/forum/#!searchin/spark-users/flatmap $ 20multiple/spark-users/1WqVhRBaJsU/-D5QRbenlUgJ我发现我应该使用flatMap,但它没有做到这一点 - 然后我的reducer开始得到像(key1,value1,key2,value2,value3,...)这样的输入 - 但它应该是[(key1,value1),(key2,value2,value3)...].换句话说,reducer开始只使用单个部分,并且不知道它是值还是键,以及值是否 - 它属于哪个键.
那么如何使用返回迭代器或列表的映射器呢?
谢谢!
想象一下 2 行:
Model.objects.all().delete()
Run Code Online (Sandbox Code Playgroud)
和
Model.objects.delete()
Run Code Online (Sandbox Code Playgroud)
执行流程有什么区别吗?数据库服务器是Mysql(Amazon RDBMS)。
第一行是不是先加载所有的对象,然后一个一个的删除呢?或者将执行“截断”命令?
而且,最重要的是- 如果第一行在执行过程中由于某些原因被中断怎么办?例如,我们有一个包含很多记录的大表。如果我们执行第一行并且脚本将被终止 - 这是否意味着某些记录将被删除,而某些记录将被删除?
谢谢你!
大约有300万个数组 - 或Python列表\元组(并不重要).每个数组由以下元素组成:
['string1', 'string2', 'string3', ...] # totally, 10000 elements
Run Code Online (Sandbox Code Playgroud)
这些数组应存储在某种键值存储中.我们现在假设这是一个Python的词典,只是为了一个简单的解释.
所以,3百万个密钥,每个密钥代表一个10000个元素的数组.
列出\元组或任何其他自定义的东西 - 它并不重要.重要的是数组应该包含字符串 - utf8或unicode字符串,每个字符串从5到50个字符.还有大约300万个可能的字符串.如果确实需要,可以用整数替换它们,但为了更有效的进一步操作,我宁愿有字符串.
虽然很难给你一个完整的数据描述(它很复杂和奇怪),但它类似于同义词 - 我们假设我们有3百万个单词 - 作为dict键 - 和每个单词的10k个同义词 - 或元素的清单.
像那样(不是真正的同义词,但它会给你一个想法):
{
'computer': ['pc', 'mac', 'laptop', ...], # (10k totally)
'house': ['building', 'hut', 'inn', ...], # (another 10k)
...
}
Run Code Online (Sandbox Code Playgroud)
元素 - "同义词" - 可以根据需要进行排序.
之后,在填充数组之后,有一个循环:我们通过所有键并检查是否有一些var在其值中.例如,用户输入"计算机"和"笔记本电脑"这两个词 - 如果"笔记本电脑"这个词是"计算机"这个词的同义词,我们必须快速回复.这里的问题是我们必须检查数百万次,大约2000万左右.想象一下,我们有很多用户输入一些随机词 - "电脑"和"汽车","手机"和"建筑物"等等.他们可能"匹配",或者他们可能"匹配".
所以,简而言之 - 我需要的是:
我应该能够将内存使用量保持在30GB以下.此外,我应该能够在不到10个小时的时间内在Xeon CPU上执行所有迭代.
可以得到大约0.1%的错误答案 - 无论是积极的还是消极的 - 虽然减少它们或者根本没有它们会更好.
这里最好的方法是什么?算法,代码链接,任何东西都非常感激.另外 - 我的一个朋友建议在这里使用布隆过滤器或marisa尝试 - 他是对的吗?我没有和他们一起工作.
我使用本教程在一台机器上安装了Hadoop 2.2:http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
一些细节有点改变 - 例如,我使用java 8,/ hadoop root dir等用户,SSH,配置密钥 - 相同.
Namenode已成功格式化:
13/12/22 05:42:31 INFO common.Storage: Storage directory /hadoop/tmp/dfs/name has been successfully formatted.
13/12/22 05:42:31 INFO namenode.FSImage: Saving image file /hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
13/12/22 05:42:32 INFO namenode.FSImage: Image file /hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 198 bytes saved in 0 seconds.
13/12/22 05:42:32 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
13/12/22 05:42:32 INFO util.ExitUtil: Exiting with status 0
13/12/22 05:42:32 INFO namenode.NameNode: SHUTDOWN_MSG:
Run Code Online (Sandbox Code Playgroud)
但是,'mkdir'甚至都没有'ls'命令工作:
$ …Run Code Online (Sandbox Code Playgroud) 我们有一个非常正常的Scrapy项目,类似于:
project/
setup.py
scrapy.cfg
SOME_DIR_WITH_PYTHON_MODULE/
__init__.py
project/
settings.py
pipelines.py
__init__.py
spiders/
__init__.py
somespider.py
Run Code Online (Sandbox Code Playgroud)
如果我们从命令行运行它,一切都很好 scrapy crawl somespider...
但是当我们部署它并使用Scrapyd运行时,它无法从SOME_DIR_WITH_PYTHON_MODULE导入代码.看起来它没有看到那里的代码由于一些未知的原因.
我们尝试在pipelines.py文件中导入它.试过这样的事:
from project.SOME_DIR_WITH_PYTHON_MODULE import *
和那样:
from SOME_DIR_WITH_PYTHON_MODULE import *
......没有任何效果.虽然它可以使用scrapy crawl从命令行"直接"执行运行.
我们该怎么做才能让它发挥作用?
谢谢!
我们需要能够重新抓取历史数据。想象一下今天是 6 月 23 日。我们今天抓取了一个网站,但几天后我们意识到我们必须重新抓取它,“看到”它与 23 日一模一样。这意味着,包括所有可能的重定向、GET 和 POST 请求等。无论如何,蜘蛛看到的所有页面都应该与 23 日完全相同。
用例:如果网站发生变化,并且我们的蜘蛛无法抓取某些内容,我们希望能够回到“过去”并在修复它后重新运行蜘蛛。
一般来说,这应该很容易 - 子类化标准 Scrapy 的缓存,强制它使用子文件夹的日期,并具有类似的内容:
cache/spider_name/2015-06-23/HERE ARE THE CACHED DIRS
但当我尝试这个时,我意识到有时蜘蛛会爬行实时网站。这意味着,它不会从缓存中获取某些页面(尽管磁盘上存在适当的文件),而是从实时网站中获取它们。这种情况尤其发生在带有验证码的页面上,但也可能发生在其他一些页面上。
我们如何强制 Scrapy始终从缓存中获取页面,而不访问实时网站?理想情况下,它甚至应该在没有互联网连接的情况下工作。
更新:我们使用了虚拟策略和 HTTPCACHE_EXPIRATION_SECS = 0
谢谢你!
我确信这很简单,但我找不到与此有关的任何内容.
我的代码很简单:
...
stream = stream.map(mapper)
stream = stream.reduceByKey(reducer)
...
Run Code Online (Sandbox Code Playgroud)
没什么特别的.毕竟,输出看起来像这样:
...
key1 value1
key2 [value2, value3]
key3 [[value4, value5], value6]
...
Run Code Online (Sandbox Code Playgroud)
等等.所以,有时我得到一个平坦的值(如果它是单一的).有时 - 嵌套列表可能非常非常深(在我的简单测试数据上它是3级深度).
我尝试通过源搜索"flat"之类的东西 - 但是只找到了flatMap方法(据我所知)并不是我需要的方法.
我不知道为什么这些列表是嵌套的.我的猜测是,它们是由不同的流程(工人?)处理的,然后在没有展平的情况下连接在一起.
当然,我可以用Python编写一个代码,它将展开该列表并将其展平.但我认为这不是一个正常的情况 - 我认为几乎每个人都需要一个平坦的输出.
itertools.chain停止在第一个找到的非可迭代值上展开.换句话说,它仍然需要一些编码(前一段).
那么 - 如何使用PySpark的本地方法展平列表?
谢谢
以下脚本逐行读取gzip文件并解码JSON对象
Pkg.add("GZip")
Pkg.add("JSON")
using GZip
using JSON
stream = GZip.gzopen(Base.ARGS[1])
_started = time()
i = 0
for line in eachline(stream)
_j = JSON.parse(line)
if i % 10000 == 0
println(time()-_started)
end
i += 1
try
key_id = _j["some_id"]
except
pass
end
end
Run Code Online (Sandbox Code Playgroud)
输出:
0.7071459293365479
20.09155511856079
37.8870849609375
Run Code Online (Sandbox Code Playgroud)
与Python比较:
import os
import sys
import gzip
import datetime
import ujson as json
_started = datetime.datetime.now()
fh = gzip.open(sys.argv[1])
for i, line in enumerate(fh):
if i % 10000 == 0:
print datetime.datetime.now() - _started …Run Code Online (Sandbox Code Playgroud) python ×6
scrapy ×3
apache-spark ×2
algorithm ×1
arrays ×1
benchmarking ×1
caching ×1
d ×1
django ×1
django-orm ×1
hadoop ×1
hdfs ×1
julia ×1
mapreduce ×1
phantomjs ×1
scrapyd ×1
web-scraping ×1