在大型 .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% 并挂起我的电脑 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python读取csv文件做dbscan分析

Python读取csv文件做dbscan分析

如何有效且快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?

109:大型CSV文件的处理方式

如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个

基于 DBSCAN 的集群字符串