我遇到了一个我似乎无法理解的记忆问题.
我在Windows 7 64位机器上运行8GB内存并运行32位python程序.
这些程序读取了5,118个压缩的numpy文件(npz).Windows报告磁盘上的文件占用1.98 GB
每个npz文件包含两个数据:'arr_0'的类型为np.float32,'arr_1'的类型为np.uint8
python脚本读取每个文件将其数据附加到两个列表中,然后关闭该文件.
在文件4284/5118周围,程序抛出一个MemoryException
但是,任务管理器说发生错误时python.exe*32的内存使用量是1,854,848K~ = 1.8GB.远低于我的8 GB限制,或者假定的32位程序的4GB限制.
在程序中我捕获内存错误并报告:每个列表的长度为4285.第一个列表包含总共1,928,588,480个float32的〜= 229.9 MB的数据.第二个列表包含12,342,966,272 uint8的〜= 1,471.3MB数据.
所以,一切似乎都在检查.除了我得到内存错误的部分.我绝对有更多的内存,它崩溃的文件大约是800KB,因此读取一个巨大的文件并没有失败.
此外,该文件未损坏.如果我事先没有耗尽所有的记忆,我可以读得很好.
为了让事情变得更加混乱,所有这一切似乎在我的Linux机器上运行良好(虽然它确实有16GB的内存,而不是我的Windows机器上的8GB),但是,它似乎并不是机器的RAM.造成这个问题.
为什么Python会抛出内存错误,当我预计它应该能够分配另外2GB的数据?
关于这一点有一些主题,但没有一个有令人满意的答案.
我有一个在IPython qt控制台中运行的python应用程序
http://ipython.org/ipython-doc/dev/interactive/qtconsole.html
当我遇到错误时,我希望能够在那时与代码进行交互.
try:
raise Exception()
except Exception as e:
try: # use exception trick to pick up the current frame
raise None
except:
frame = sys.exc_info()[2].tb_frame.f_back
namespace = frame.f_globals.copy()
namespace.update(frame.f_locals)
import IPython
IPython.embed_kernel(local_ns=namespace)
Run Code Online (Sandbox Code Playgroud)
我认为这会奏效,但我收到一个错误:
RuntimeError:线程只能启动一次
我正在学习如何将Qt与PyQt一起使用,我有一个带有StandardItemModel的QTabelView我已成功填充模型并将itemChanged信号连接到一个插槽.我想乱搞IPython中返回的任何对象,所以目前我有这条线:
def itemChangedSlot(epw, item):
new_data = item.data()
print new_data
print item
Run Code Online (Sandbox Code Playgroud)
打印
<PyQt4.QtGui.QStandardItem object at 0x07C5F930>
<PyQt4.QtCore.QVariant object at 0x07D331F0>
Run Code Online (Sandbox Code Playgroud)
在IPython会话中是否可以使用此内存地址获取对象?我在Google上没有看到任何内容,也许我没有正确的术语?
这不是一个好奇心问题.
在我的64位Linux解释器上,我可以执行
In [10]: np.int64 == np.int64
Out[10]: True
In [11]: np.int64 is np.int64
Out[11]: True
Run Code Online (Sandbox Code Playgroud)
太棒了,正是我所期待的.但是我发现了numpy.core.numeric模块的这个奇怪的属性
In [19]: from numpy.core.numeric import _typelessdata
In [20]: _typelessdata
Out[20]: [numpy.int64, numpy.float64, numpy.complex128, numpy.int64]
Run Code Online (Sandbox Code Playgroud)
很奇怪为什么numpy.int64在那里两次?让我们调查一下
In [23]: _typelessdata[0] is _typelessdata[-1]
Out[23]: False
In [24]: _typelessdata[0] == _typelessdata[-1]
Out[24]: False
In [25]: id(_typelessdata[-1])
Out[25]: 139990931572128
In [26]: id(_typelessdata[0])
Out[26]: 139990931572544
In [27]: _typelessdata[-1]
Out[27]: numpy.int64
In [28]: _typelessdata[0]
Out[28]: numpy.int64
Run Code Online (Sandbox Code Playgroud)
哇他们是不同的.这里发生了什么?为什么有两个np.int64?
我在python中使用opencv弄湿了,我觉得一个好的开始就是加载一个图像.
我在我的系统上构建了opencv,并在目录tpl/opencv中有python绑定和opencv dll,这与我的项目有关.
以下是一些演示此问题的代码:
from tpl.opencv import cv2
from tpl.opencv.cv2 import cv
from PIL import Image
pil_img = Image.open('C:/test_file.jpg') #Read a temp file, the input is actually a computed image chip
tmpname = 'C:/tmp.png'
pil_img.save(tmpname,'PNG') # Write the image chip to disk
im = cv.LoadImage(tmpname) # This seems to work
im2 = cv2.imread(tmpname) # This always returns None
Run Code Online (Sandbox Code Playgroud)
没有错误消息,im2总是无.我可以用我导入opencv的方式搞砸了吗?有一个简单的解决方法吗?
当我创造
cvFeatDetector = cv2.FeatureDetector_create("MSER")
Run Code Online (Sandbox Code Playgroud)
我知道,所以cv2的一部分似乎有效
作为一种解决方法,我只是用numpy加载图像
im2 = numpy.imread(inname)
im = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # This works. I was able to imshow …
Run Code Online (Sandbox Code Playgroud) 我有一些文字:
s="Imageclassificationmethodscan beroughlydividedinto two broad families of approaches:"
Run Code Online (Sandbox Code Playgroud)
我想把它解析成单词.我很快调查了附魔和nltk,但没有看到任何看起来立即有用的东西.如果我有时间投入这个,我会考虑编写一个动态程序,附魔能够检查一个单词是否是英语.我原以为在网上有什么可以做的,我错了吗?
根据我的实验,我猜这个答案是否定的.但也许有可能对期货模块进行一些改变.
我想提交一个自己创建执行者并提交工作的工人.我想把第二个未来归还给主流程.我有这个MWE,它不起作用,因为f2
当它通过多处理发送时,对象可能会与其父执行器解除关联.(如果两个执行程序都是ThreadPoolExecutor,它确实有效,因为f2
永远不会复制该对象).
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time
def job1():
try:
ex2 = ThreadPoolExecutor()
time.sleep(2)
f2 = ex2.submit(job2)
finally:
ex2.shutdown(wait=False)
return f2
def job2():
time.sleep(2)
return 'done'
try:
ex1 = ProcessPoolExecutor()
f1 = ex1.submit(job1)
finally:
ex1.shutdown(wait=False)
print('f1 = {!r}'.format(f1))
f2 = f1.result()
print('f1 = {!r}'.format(f1))
print('f2 = {!r}'.format(f2))
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否有任何安全的方法可以在多处理管道中发送未来的对象,并且能够在完成后接收该值.看起来我可能需要设置另一个类似于执行器的构造,用于侦听另一个管道上的结果.
我正在使用代表图表的pandas DataFrame.数据帧由指示节点端点的MultiIndex索引.
建立:
import pandas as pd
import numpy as np
import itertools as it
edges = list(it.combinations([1, 2, 3, 4], 2))
# Define a dataframe to represent a graph
index = pd.MultiIndex.from_tuples(edges, names=['u', 'v'])
df = pd.DataFrame.from_dict({
'edge_id': list(range(len(edges))),
'edge_weight': np.random.RandomState(0).rand(len(edges)),
})
df.index = index
print(df)
## -- End pasted text --
edge_id edge_weight
u v
1 2 0 0.5488
3 1 0.7152
4 2 0.6028
2 3 3 0.5449
4 4 0.4237
3 4 5 0.6459
Run Code Online (Sandbox Code Playgroud)
我希望能够使用边缘子集索引图形,这就是我选择使用a的原因MultiIndex …
我想在 matplotlib 中渲染一个体积。体积是一个简单的 7x7x7 立方体,我希望能够看到所有内部体素(即使我知道它看起来会一团糟)。
我已经能够渲染具有透明度的体素,但似乎永远不会绘制任何不在表面上的体素。
我拼凑了一个 MWE
以下代码创建了一个 5x5x5 的体积,其中包含红色、绿色、蓝色、黄色和青色 5x5 层。每层的 alpha 设置为 0.5,所以整个东西应该是透明的。
然后我将所有非表面体素的颜色更改为带有 alpha 1 的黑色,因此如果它们正在显示,我们应该能够在中心看到一个黑框。
自己渲染它会产生左边的图,但是如果我们从青色层中移除填充,我们可以看到黑框确实存在,只是没有显示出来,因为即使那些遮挡体素,它也被 100% 遮挡了alpha 小于 1。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # NOQA
spatial_axes = [5, 5, 5]
filled = np.ones(spatial_axes, dtype=np.bool)
colors = np.empty(spatial_axes + [4], dtype=np.float32)
alpha = .5
colors[0] = [1, 0, 0, alpha]
colors[1] = [0, 1, 0, alpha]
colors[2] = [0, 0, 1, alpha]
colors[3] = [1, 1, 0, alpha] …
Run Code Online (Sandbox Code Playgroud) 我有一个QTableView,可以动态加载来自继承QAbstractItemModel的自定义模型的数据.该模型实现了fetchMore和canFetchMore.
问题是我希望能够为小数据集选择所有行,但如果我在视图中点击ctrl-a,它只会选择当前加载的行.
是否有某种机制强制QTableView获取更多行?理想情况下,我想显示一个进度条,指示从模型加载的数据部分.每隔几秒钟我就想强制模型加载更多的数据,但我仍然希望让用户与目前已加载的数据进行交互.这样,当进度条完成时,用户可以按ctrl-a并确信所有数据都已被选中.
编辑:我有另一个激励用例.我想跳转到特定的行,但如果没有加载该行,我的界面什么都不做.
如何强制QAbstractItemModel获取更多(或特定行),然后强制QTableView显示它?
如果我没有实现fetchMore和canFetchMore,之前的功能可以正常工作,但加载表格非常慢.当我实现这些方法时,情况正好相反.没有这个问题的答案导致我的qt界面的可用性问题,所以我正在为这个问题打开奖金.
这是我用来选择特定行的方法.
def select_row_from_id(view, _id, scroll=False, collapse=True):
"""
_id is from the iders function (i.e. an ibeis rowid)
selects the row in that view if it exists
"""
with ut.Timer('[api_item_view] select_row_from_id(id=%r, scroll=%r, collapse=%r)' %
(_id, scroll, collapse)):
qtindex, row = view.get_row_and_qtindex_from_id(_id)
if row is not None:
if isinstance(view, QtWidgets.QTreeView):
if collapse:
view.collapseAll()
select_model = view.selectionModel()
select_flag = QtCore.QItemSelectionModel.ClearAndSelect
#select_flag = QtCore.QItemSelectionModel.Select
#select_flag = QtCore.QItemSelectionModel.NoUpdate
with ut.Timer('[api_item_view] selecting name. qtindex=%r' % (qtindex,)):
select_model.select(qtindex, select_flag)
with ut.Timer('[api_item_view] …
Run Code Online (Sandbox Code Playgroud) python ×9
numpy ×3
ipython ×2
dereference ×1
file-io ×1
matplotlib ×1
memory ×1
nlp ×1
opencv ×1
pandas ×1
pyqt ×1
pyqt4 ×1
python-2.7 ×1
qt ×1
qtableview ×1
qtconsole ×1
windows ×1