Как Вы обрабатываете “Слишком много файлов” проблема при работе в Bash?

Проверьте это:

scala>  val df =Seq( ( (Timestamp.valueOf("2019-01-01 01:02:03")), (Timestamp.valueOf("2019-01-10 01:02:03")), (Timestamp.valueOf("2019-01-15 01:02:03") ), (Timestamp.valueOf("2019-02-22 01:02:03")) ) ).toDF("t1","t2","t3","t4")
df: org.apache.spark.sql.DataFrame = [t1: timestamp, t2: timestamp ... 2 more fields]

scala> df.show(false)
+-------------------+-------------------+-------------------+-------------------+
|t1                 |t2                 |t3                 |t4                 |
+-------------------+-------------------+-------------------+-------------------+
|2019-01-01 01:02:03|2019-01-10 01:02:03|2019-01-15 01:02:03|2019-02-22 01:02:03|
+-------------------+-------------------+-------------------+-------------------+


scala> val ts_cols = df.dtypes.filter( _._2 == "TimestampType" ).map( _._1)
ts_cols: Array[String] = Array(t1, t2, t3, t4)

scala> val exp1 = ts_cols.map ( x=> col(x).lt(current_date()-expr("INTERVAL 30 DAYS")) ).reduce( _||_ )
exp1: org.apache.spark.sql.Column = ((((t1 < (current_date() - interval 4 weeks 2 days)) OR (t2 < (current_date() - interval 4 weeks 2 days))) OR (t3 < (current_date() - interval 4 weeks 2 days))) OR (t4 < (current_date() - interval 4 weeks 2 days)))

scala> df.select(col("*"),exp1.as("ts_comp") ).show(false)
+-------------------+-------------------+-------------------+-------------------+-------+
|t1                 |t2                 |t3                 |t4                 |ts_comp|
+-------------------+-------------------+-------------------+-------------------+-------+
|2019-01-01 01:02:03|2019-01-10 01:02:03|2019-01-15 01:02:03|2019-02-22 01:02:03|false  |
+-------------------+-------------------+-------------------+-------------------+-------+

true контрольный пример

scala> val df2 =Seq( ( (Timestamp.valueOf("2018-01-01 01:02:03")), (Timestamp.valueOf("2018-01-10 01:02:03")), (Timestamp.valueOf("2018-01-15 01:
02:03") ), (Timestamp.valueOf("2018-02-22 01:02:03")) ) ).toDF("t1","t2","t3","t4")
df2: org.apache.spark.sql.DataFrame = [t1: timestamp, t2: timestamp ... 2 more fields]

scala> df2.select(col("*"),exp1.as("ts_comp") ).show(false)
+-------------------+-------------------+-------------------+-------------------+-------+
|t1                 |t2                 |t3                 |t4                 |ts_comp|
+-------------------+-------------------+-------------------+-------------------+-------+
|2018-01-01 01:02:03|2018-01-10 01:02:03|2018-01-15 01:02:03|2018-02-22 01:02:03|true   |
+-------------------+-------------------+-------------------+-------------------+-------+


scala>
6
задан Vinko Vrsalovic 9 October 2008 в 06:18
поделиться

5 ответов

В более новых версиях findutils находка может сделать работу xargs (включая glomming поведение, такое, что только, поскольку много процессов grep по мере необходимости используются):

find ../path -exec grep foo '{}' +

Использование + вместо ; поскольку последний аргумент инициировал это поведение.

8
ответ дан 8 December 2019 в 13:03
поделиться

Если существует риск имен файлов, содержащих пробелы, необходимо не забыть использовать флаг-print0 для нахождения вместе с этими-0 флагами к xargs:

find . -print0 | xargs -0 grep -H foo
6
ответ дан 8 December 2019 в 13:03
поделиться

xargs не запускает новый процесс для каждого файла. Это сгруппировывает вместе аргументы. Взгляните на-n опцию к xargs - это управляет количеством аргументов, переданных каждому выполнению подкоманды.

4
ответ дан 8 December 2019 в 13:03
поделиться

Я не вижу это

for i in *; do
    grep foo $i
done

работал бы, так как я думал, что "слишком много файлов" были ограничением оболочки, следовательно оно перестанет работать для для цикла также.

Однако я всегда позволяю xargs сделать трудную работу разделения списка аргументов в управляемые биты таким образом:

find ../path/ | xargs grep foo

Это не запустит процесс на файл, но на группу файлов.

0
ответ дан 8 December 2019 в 13:03
поделиться

Ну, у меня были те же проблемы, но кажется, что все, что я придумал, уже упоминается. Главным образом, имел две проблемы. Выполнение шариков является дорогим, делание ls на миллионе каталогов файлов берет навсегда (20 + минуты на одном из моих серверов), и выполнение ls * на миллионе каталогов файлов берет навсегда и приводит к сбою со "списком аргументов слишком долго" ошибку.

find /some -type f -exec some command {} \; 

кажется, помогает с обеими проблемами. Кроме того, если необходимо сделать более сложные операции на этих файлах, Вы могли бы рассмотреть для сценариев материала в несколько потоков. Вот краткая информация Python для сценариев материала CLI. http://www.ibm.com/developerworks/aix/library/au-pythocli/?ca=dgr-lnxw06pythonunixtool&S_TACT=105AGX59&S_CMP=GR

0
ответ дан 8 December 2019 в 13:03
поделиться