我正在编写的Python程序是从文件顶部读取一定数量的行,程序需要保留此标题以备将来使用.目前,我正在做类似以下的事情:
header = ''
header_len = 4
for i in range(1, header_len):
header += file_handle.readline()
Run Code Online (Sandbox Code Playgroud)
Pylint抱怨说我没有使用变量i.什么是更pythonic方式来做到这一点?
编辑:程序的目的是智能地将原始文件拆分为较小的文件,每个文件包含原始标题和数据的子集.因此,在读取文件的其余部分之前,我需要读取并保留标题.
我在Python中打开一个3 GB的文件来读取字符串.然后我将这些数据存储在字典中.我的下一个目标是使用这个字典构建一个图形,所以我正在密切监视内存使用情况.
在我看来,Python将整个3 GB文件加载到内存中,我无法摆脱它.我的代码看起来像这样:
with open(filename) as data:
accounts = dict()
for line in data:
username = line.split()[1]
IP = line.split()[0]
try:
accounts[username].add(IP)
except KeyError:
accounts[username] = set()
accounts[username].add(IP)
print "The accounts will be deleted from memory in 5 seconds"
time.sleep(5)
accounts.clear()
print "The accounts have been deleted from memory"
time.sleep(5)
print "End of script"
Run Code Online (Sandbox Code Playgroud)
最后一行是在那里,以便我可以监视内存使用情况.该脚本在内存中使用超过3 GB的位.清除字典可以释放大约300 MB.当脚本结束时,释放剩余的内存.
我正在使用Ubuntu,我使用"系统监视器"和终端中的"免费"命令监视内存使用情况.
我不明白的是为什么在我清除字典之后Python需要这么多内存.文件是否仍存储在内存中?如果是这样,我怎么能摆脱它呢?我的操作系统没有看到释放内存的问题吗?
编辑:我已经尝试在清除字典后强行执行gc.collect(),但无济于事.
EDIT2:我在Ubuntu 12.04.LTS上运行Python 2.7.3
EDIT3:我意识到我忘了提到一些非常重要的东西.我真正的问题不在于我的操作系统没有"取回"Python使用的内存.后来,Python似乎没有重用那个内存(它只是要求操作系统有更多的内存).
我有一个应用程序从中复制文件src到dst:
import shutil
from threading import Thread
t = Thread(target=shutil.copy, args=[ src, dst ]).start()
Run Code Online (Sandbox Code Playgroud)
我希望应用程序每隔5秒查询一次副本的进度,而不会锁定应用程序本身.这可能吗?
我的目的是将此进度设置为a QtGui.QLabel以向用户提供有关文件副本的反馈.
使用线程shutil文件副本进行复制时可以实现吗?
我的目标是使用请求对文件的一部分进行PUT并流式传输文件(即,不将其加载到内存中然后执行PUT).
此页面说明了如何为整个文件执行此操作:
请求支持流式上传,允许您发送大型流或文件而无需将其读入内存.要进行流式传输和上传,只需为您的身体提供类似文件的对象:
with open('massive-body', 'rb') as f:
requests.post('http://some.url/streamed', data=f)
Run Code Online (Sandbox Code Playgroud)
但是在我的情况下,我只想发送一个文件块.有没有办法实现这个目标?
在概念上,类似于:
with open('massive-body', 'rb') as f:
requests.post('http://some.url/streamed', data=f.read(chunksize))
Run Code Online (Sandbox Code Playgroud) 我需要处理一些比RAM大几百倍的数据.我想在大块中读取,处理它,保存结果,释放内存并重复.有没有办法在python中提高效率?
我有以下问题。我的目的是处理一堆文档(将所有单词转换为正常形式,例如 'was' --> 'be', 'were' --> 'be', 'went' --> 'go')。这意味着,我需要打开目录中的每个文件,更改其内容并将其保存在另一个目录中。
由于这个过程很耗时,我决定在joblib的帮助下进行并行处理。下面的代码可以正常工作(我的意思是,它执行了它必须执行的操作),但是我遇到了一个巨大的内存问题。
它一直在不断增长!
它会一直增长,直到服务器上根本没有剩余内存。
from joblib import delayed, Parallel
def process_text(text):
# some function which processes
# text and returns a new text
return processed_text
def process_and_save(document_id):
with open(path + document_id) as f:
text = f.read()
text = process_text(text)
f = open(other_path + document_id, 'w')
f.write(text)
f.close()
all_doc_ids = # a list of document ids which I need to process
Parallel(n_jobs=10)(delayed(process_and_save)(doc_id) for doc_id in all_doc_ids)
Run Code Online (Sandbox Code Playgroud)
我还尝试将 joblib 更改为 multipricessing:
pool = …Run Code Online (Sandbox Code Playgroud) 我有一个非常大的 csv 文件,无法完全加载到内存中。所以我想一块一块地读取它,将它转换成 numpy 数组,然后再做一些处理。
我已经检查过: Lazy Method for Reading Big File in Python?
但这里的问题是它是一个普通的阅读器,我无法在 csvReader 中找到任何指定大小的选项。
此外,由于我想将行转换为 numpy 数组,因此我不想将任何行读成两半,所以我想要一些可以在阅读器中指定“行数”的东西,而不是指定大小。
是否有任何内置功能或简单的方法来做到这一点。
我对 Scrapy 很陌生。我正在考虑使用它来抓取整个网站的链接,在其中我会将项目输出到多个 JSON 文件中。因此,我可以将它们上传到 Amazon Cloud Search 以进行索引。是否可以将项目拆分为多个文件而不是最终只有一个大文件?根据我的阅读,项目导出器只能输出到每个蜘蛛的一个文件。但我只使用一个 CrawlSpider 来完成这项任务。如果我可以对每个文件中包含的项目数量设置一个限制,比如 500 或 1000,那就太好了。
这是我到目前为止设置的代码(基于教程中使用的 Dmoz.org):
dmoz_spider.py
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from tutorial.items import DmozItem
class DmozSpider(CrawlSpider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/",
]
rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)]
def parse_item(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
Run Code Online (Sandbox Code Playgroud)
项目.py
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link …Run Code Online (Sandbox Code Playgroud) 我想将一些mp3存储在一个没有公开的文件夹中,不能通过网络直接访问,并允许用户只有在登录后才能通过浏览器收听/下载歌曲.
我怎样才能做到这一点 ?
我用django进行web开发,但如果我知道它是如何工作就足够了.
我有一个大文件(950MB),它具有以下单词和频率,每行一个:
word1 54
word2 1
word3 12
word4 3
word1 99
word4 147
word1 4
word2 6
等等...
我需要对单词的频率求和,例如word1 = 54 + 99 + 4 = 157,并将其输出到列表/文件.在Python中执行此操作的最有效方法是什么?
我试图做的是创建一个列表,每一行都是这个列表中的一个元组,从那里总结,这使我的笔记本电脑崩溃了......
python ×8
file-io ×2
memory ×2
chunks ×1
cpu-word ×1
csv ×1
django ×1
file ×1
frequency ×1
generator ×1
joblib ×1
json ×1
large-files ×1
media-player ×1
mediaelement ×1
pool ×1
python-2.7 ×1
scrapy ×1
sum ×1