hibernate-Query.list()与Query.iterate()比较

hibernate-Query.list()与Query.iterate()比较

 

对于list方法而言,实际上Hibernate是通过一条Select SQL获取所有的记录。并将其读出,填入到POJO中返回。
而iterate 方法,则是首先通过一条Select SQL 获取所有符合查询条件的记录的id,再对这个id 集合进行循环操作,通过单独的Select SQL 取出每个id 所对应的记录,之后填入POJO中返回。
也就是说,对于list 操作,需要一条SQL 完成。而对于iterate 操作,需要n+1条SQL。
看上去iterate方法似乎有些多余,但在不同的情况下确依然有其独特的功效,如对海量数据的查询,如果用list方法将结果集一次取出,内存的开销可能无法承受。
另一方面,对于我们现在的Cache机制而言,list方法将不会从Cache中读取数据,它总是一次性从数据库中直接读出所有符合条件的记录。而iterate 方法因为每次根据id获取数据,这样的实现机制也就为从Cache读取数据提供了可能,hibernate首先会根据这个id 在本地Cache 内寻找对应的数据,如果没找到,再去数据库中检索。

Query的两个方法,list() 和 iterate() , 两个方法都是把结果集列出来, 他们有3点不一样,
1:返回的类型不一样,list()返回List, iterate()返回Iterator,
2: 获取数据的方式不一样,list()会直接查数据库, iterate()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1。

3:iterate会查询2级缓存, list只会查询一级缓存。
4: list()中返回的List中每个对象都是原本的对象, iterate()中返回的对象是代理对象.(debug可以发现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这篇论文提出了一种基于迭代收缩与合并的分层图像分割方法。下面是该方法的 Python 实现步骤: 1. 导入必要的库 ```python import numpy as np from scipy import ndimage from skimage.measure import label, regionprops ``` 2. 定义函数 `merge_regions`,用于合并相似的区域 ```python def merge_regions(regions, similarity_threshold): """ Merge similar regions by comparing their mean intensities. Parameters ---------- regions : list List of region properties. similarity_threshold : float Threshold value for region similarity. Returns ------- list List of merged region properties. """ num_regions = len(regions) merged_regions = [] # Find similar regions and merge them for i in range(num_regions): if i not in [r.label-1 for r in merged_regions]: region1 = regions[i] for j in range(i+1, num_regions): if j not in [r.label-1 for r in merged_regions]: region2 = regions[j] if abs(region1.mean_intensity - region2.mean_intensity) < similarity_threshold: merged_region = region1 + region2 merged_regions.append(merged_region) # Add regions that were not merged for i in range(num_regions): if i not in [r.label-1 for r in merged_regions]: merged_regions.append(regions[i]) return merged_regions ``` 3. 定义函数 `contract_regions`,用于收缩相邻的区域 ```python def contract_regions(label_img, regions): """ Contract neighboring regions. Parameters ---------- label_img : numpy.ndarray Labeled image. regions : list List of region properties. Returns ------- numpy.ndarray Labeled image after contraction. """ num_regions = len(regions) labeled_array = label_img.copy() # Iterate over each pixel for i in range(label_img.shape[0]): for j in range(label_img.shape[1]): label1 = labeled_array[i, j] if label1 > 0: for k in range(i-1, i+2): for l in range(j-1, j+2): if k >= 0 and k < label_img.shape[0] and l >= 0 and l < label_img.shape[1]: label2 = labeled_array[k, l] if label2 > 0 and label2 != label1: region1 = regions[label1-1] region2 = regions[label2-1] if abs(region1.mean_intensity - region2.mean_intensity) < 0.1*(region1.max_intensity - region1.min_intensity): labeled_array[k, l] = label1 return labeled_array ``` 4. 定义函数 `segment_image`,用于分割图像 ```python def segment_image(img, similarity_threshold=10): """ Segment an image using hierarchical iterative contraction and merging. Parameters ---------- img : numpy.ndarray Input image. similarity_threshold : float, optional Threshold value for region similarity. Default is 10. Returns ------- numpy.ndarray Labeled image. """ # Smooth the image img = ndimage.gaussian_filter(img, sigma=2) # Initialize label image label_img = np.zeros(img.shape, dtype=int) # Initialize regions regions = regionprops(label_img, intensity_image=img) # Iterate over each level for i in range(256): # Contract regions label_img = contract_regions(label_img, regions) # Update regions regions = regionprops(label_img, intensity_image=img) # Merge regions regions = merge_regions(regions, similarity_threshold) # Stop when only one region is left if len(regions) == 1: break # Label the image labeled_img = np.zeros(img.shape, dtype=int) for region in regions: labeled_img[label_img == region.label] = region.label return labeled_img ``` 5. 调用 `segment_image` 函数,对输入图像进行分割 ```python # Load an image img = ndimage.imread('input_image.jpg', flatten=True) # Segment the image labeled_img = segment_image(img) ``` 这样就完成了基于迭代收缩与合并的分层图像分割方法的 Python 实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值