在大型 .csv 文件上应用 DBSCAN 会导致磁盘使用量超过 100% 并挂起我的电脑 [重复]
Posted
技术标签:
【中文标题】在大型 .csv 文件上应用 DBSCAN 会导致磁盘使用量超过 100% 并挂起我的电脑 [重复]【英文标题】:Application of DBSCAN on a large .csv file results in a disc use overshoot to 100% and hangs my computer [duplicate] 【发布时间】:2017-11-25 10:30:02 【问题描述】:所以我的任务是从 .csv 文件中读取数据并形成集群。我的代码在一个小的 .csv 文件上运行良好,但是当我尝试读取我必须处理的原始文件(它包含大约 24k 行)时,我的计算机挂起并且磁盘使用率达到 100%,并且我有 t0 重新启动系统。我在这里陷入了死胡同,不知道发生了什么。 DBSCAN 代码与 sklearn 网站上提供的演示相同。但是读取数据的代码是我自己写的
import csv
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn import metrics
#from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler
import csv
def dbFun( _x,_original_vals):
db = DBSCAN(eps=0.3, min_samples=20).fit(_x)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_
#print(labels)
n_clusters_ = len(set(labels)) - (1 if -1 else 0)
print('Estimated number of clusters: %d' % n_clusters_)
print("Wait plotting clusters.....")
plotCluster(_x, labels, core_samples_mask, n_clusters_)
return
def plotCluster( _x, labels, core_samples_mask, n_clusters_):
unique_labels = set(labels)
colors = [plt.cm.Spectral(each)
for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
if k == -1:
# Black used for noise.
col = [0, 0, 0, 1]
class_member_mask = (labels == k)
xy = _x[class_member_mask & core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
markeredgecolor='k', markersize=14)
xy = _x[class_member_mask & ~core_samples_mask]
plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
markeredgecolor='k', markersize=6)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()
return
_val = []
with open('C:/Users/hp 5th/Desktop/new1.csv', 'rU') as inp:
rd = csv.reader(inp)
for row in rd:
_val.append([row[1],row[2], row[0]])
#print(_center)
_val = np.asarray(_val)
_val_original = _val
_val_original =_val_original.astype('float32')
_val = StandardScaler().fit_transform(_val_original)
dbFun(_val, _val_original)
#_len = len(_center)
【问题讨论】:
【参考方案1】:这称为“交换”,即你的内存太少了。
sklearn DBSCAN 实现是最坏情况 O(n²) 内存。
使用带有索引的 ELKI。它比 sklearn 需要更少的内存。
【讨论】:
是的,我想就是这样。因为其余的代码非常简单。我一定会研究 ELKI。 但是我不熟悉java。有什么办法可以在 python 中做到这一点吗?此外,这项任务只是我更大项目的一部分。我不知道如何将 ELKI 与其他部分集成 您可以只使用“子流程”模块,并使用 CSV 文件。以上是关于在大型 .csv 文件上应用 DBSCAN 会导致磁盘使用量超过 100% 并挂起我的电脑 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何有效且快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?